haskell - 具有多个变量的无点组合

标签 haskell function-composition pointfree

我已经开始关注它,并且更喜欢将它用于简单的情况,在这些情况下,我基本上可以将值从一个输出传递到一个输入。我喜欢的无点构图的一个简单示例是:

let joinLines = foldr (++) "" . intersperse "\n"

今天玩GHCI的时候,想看看能不能作曲not(==)复制 (/=) ,但我真的无法推理出来。 (==)取两个输入,not需要一个。我认为这可能有效:
let ne = not . (==)

假设单个 Bool (==) 的输出会去not ,但它不会编译,引用以下错误:
<interactive>:1:16:
    Couldn't match expected type `Bool' with actual type `a0 -> Bool'
    Expected type: a0 -> Bool
      Actual type: a0 -> a0 -> Bool
    In the second argument of `(.)', namely `(==)'
    In the expression: not . (==)

我希望我能说这对我来说意义重大,但我得到的只是可能传递给 (==) 的第二个参数。正在为 not 搞砸事情?任何人都可以帮助我更好地理解这个组合背后的逻辑吗?

最佳答案

如果你当时开始删除一个论点,你会得到

ne x y = not (x == y)
       = (not . (x ==)) y
ne x   = not . (x ==)
       = not . ((==) x)
       = ((not .) . (==)) x
ne     = (not .) . (==)

基本上,对于每个参数,您都需要一个 (.) ,正确关联。
(==)的类型是 Eq a => a -> a -> Bool .所以如果你写 whatever . (==) , 并传递一个值 x对此,你会得到 whatever ((==) x) , 但是 (==) x是一个函数a -> Bool (其中 ax 的类型,以及 Eq 的实例)。所以whatever必须接受函数类型的参数。

关于haskell - 具有多个变量的无点组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409572/

相关文章:

haskell - 使用类型族时证明约束

haskell - 测量二叉树大小的函数

haskell - 使用自定义比较器函数压缩两个列表的标准方法

haskell - 是否有惯用的pointfree方法通过另一个函数调用带参数的函数

haskell - 这个haskell代码中的星号是什么意思?

haskell - 可变参数组合函数?

haskell - IO monad 中的函数组合

clojure - 为什么匿名函数定义语法存在差异?

haskell - 为什么这个函数的pointfree版本看起来像这样?

haskell - 在haskell中具有多值函数的函数组合?