布尔运算符中的函数组合

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) 并与 . 一起内置。