【发布时间】:2017-01-09 02:58:28
【问题描述】:
我没有太多的 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,然后是一个布尔值并返回两个参数的“与”。
但现在我被困住了。您将如何继续使用传统的函数式语言?有没有办法在没有 lambdas/closures 的情况下表达解决方案?
我愿意为该语言添加新功能,只要它仍然不够强大且简单。
【问题讨论】:
-
在 Haskell 中你可以写
f x = ((gt 0) len x) && ((lt 100) len x)。你接受你的语言吗? -
“没有高阶函数”是什么意思?
-
@leftaroundabout 没有将其他函数作为参数的函数。
-
你的语言已经有了一个高阶函数:合成。
-
我相信,有了这个原语列表,你永远不能使用两次参数。那里的一切看起来都是严格线性的:你使用它,你就会失去它。我认为,众所周知,这会大大降低语言的表达能力。您需要一些复制器,例如组合逻辑中的
S或箭头中的&&&。或let x = e in ....
标签: haskell types functional-programming language-design function-composition