gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:19:33 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com