【发布时间】:2012-09-13 15:18:20
【问题描述】:
我已经开始关注它,并且更喜欢将它用于简单的情况,在这种情况下,我基本上可以将值从一个输出传递到一个输入。我喜欢的无点组合的一个简单示例是:
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 搞砸?谁能帮我更好地理解这个组合背后的逻辑?
【问题讨论】:
-
对于无积分的爱好者:您正在寻找的组合器是
(.).(.) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c,或fmap . fmap。 -
@phipsgabler,当“第一个”函数采用 3 个参数(如
(.).(.).(.))时,这会起作用吗? -
@Alexey Phew。抱歉,我是 8 年前写的,已经有几年没有使用 Haskell 了 :) 用
:t在 GHCI 中试试吧,我猜? -
@phipsgabler,我想会的,我希望你能确认一下,这样我就不用多想了:)。
标签: haskell function-composition pointfree