【问题标题】:Function composition in boolean operators布尔运算符中的函数组合
【发布时间】: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


【解决方案1】:

这被称为pointfree style,网络上有一个很好的tool 用于将Haskell 代码转换为它。转换f xs = (length xs > 0) && (length xs < 100) 得到f = ap ((&&) . (> 0) . length) ((< 100) . length)。所以你只是缺少ap 函数(另见Understanding `ap` in a point-free function in Haskell)。对于您的应用程序,它应该具有(a -> b -> c) -> (a -> b) -> (a -> c) 类型并与. 一起内置。

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2011-09-05
    • 2011-04-20
    • 2011-09-27
    • 2011-03-27
    相关资源
    最近更新 更多