我已经开始关注它,并且更喜欢将它用于简单的情况,在这些情况下,我基本上可以将值从一个输出传递到一个输入。我喜欢的无点构图的一个简单示例是:
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
(其中 a
是 x
的类型,以及 Eq
的实例)。所以whatever
必须接受函数类型的参数。
关于haskell - 具有多个变量的无点组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409572/