布尔运算符中的函数组合
Function composition in boolean operators
我没有太多 FP 经验,我想我只是缺少来自更精通的人的关键见解。我正在编写一种小型、嵌入式、功能性、严格且不变类型的语言。
我将在这个问题中使用类似 Haskell 的语法。
以下签名适用于具有您所期望的类型的预定义函数:
and :: bool -> bool -> bool -- boolean and
lt :: int -> int -> bool -- less than
gt :: int -> int -> bool -- greater than
len :: list -> int -- list length
我的工作是将这些函数(和常量)组合成一个具有以下签名的表达式:
λ :: list -> bool
其结果是列表的长度是否在 1 到 99 之间。
约束:该语言(目前)仅支持函数应用和函数组合。没有 lambda 表达式,没有高阶函数。
这是我的进展:
and . ((gt 0) . len) :: list -> bool -> bool
这需要一个列表,检查它的长度是否大于 0,然后是布尔值和 returns 两个参数的 "and"。
但现在我卡住了。您将如何从这里继续使用传统的函数式语言?有没有不用lambdas/closures表达解决方案的方法?
我愿意为该语言添加新功能,只要它保持功能不足且简单。
这叫做pointfree style and there is a nice tool on the web for transforming Haskell code to it. Converting f xs = (length xs > 0) && (length xs < 100)
gives f = ap ((&&) . (> 0) . length) ((< 100) . length)
. So you are just missing the ap
function (see also )。对于您的应用程序,它应该具有类型 (a -> b -> c) -> (a -> b) -> (a -> c)
并与 .
一起内置。
我没有太多 FP 经验,我想我只是缺少来自更精通的人的关键见解。我正在编写一种小型、嵌入式、功能性、严格且不变类型的语言。
我将在这个问题中使用类似 Haskell 的语法。
以下签名适用于具有您所期望的类型的预定义函数:
and :: bool -> bool -> bool -- boolean and
lt :: int -> int -> bool -- less than
gt :: int -> int -> bool -- greater than
len :: list -> int -- list length
我的工作是将这些函数(和常量)组合成一个具有以下签名的表达式:
λ :: list -> bool
其结果是列表的长度是否在 1 到 99 之间。
约束:该语言(目前)仅支持函数应用和函数组合。没有 lambda 表达式,没有高阶函数。
这是我的进展:
and . ((gt 0) . len) :: list -> bool -> bool
这需要一个列表,检查它的长度是否大于 0,然后是布尔值和 returns 两个参数的 "and"。
但现在我卡住了。您将如何从这里继续使用传统的函数式语言?有没有不用lambdas/closures表达解决方案的方法?
我愿意为该语言添加新功能,只要它保持功能不足且简单。
这叫做pointfree style and there is a nice tool on the web for transforming Haskell code to it. Converting f xs = (length xs > 0) && (length xs < 100)
gives f = ap ((&&) . (> 0) . length) ((< 100) . length)
. So you are just missing the ap
function (see also (a -> b -> c) -> (a -> b) -> (a -> c)
并与 .
一起内置。