gpt4 book ai didi

haskell - 表达式 str a b = ((.).(.)) (0 -) (+) 1 2

转载 作者:行者123 更新时间:2023-12-02 02:49:19 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Composing function composition: How does (.).(.) work?

(7 个回答)


8年前关闭。




您能否向我解释以下表达式的工作原理:

str a b = ((.).(.)) (0 -) (+) 1 2

我查了一下,GHCi说是 -3但我不明白为什么。

我还检查了以下内容:
*Main> :t ((.).(.))
((.).(.)) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c

但这对我没有帮助。

任何的想法?

最佳答案

运营商(.).(.)有时会被赋予一个别名:

(.:) = (.).(.)

您可以将其查看为 (.) ,只有当第二个函数接受两个参数时才有效。所以这是有效的,例如:
sqrtsum = sqrt .: (+)
-- sqrtsum 4 5 ==> 3.0

这将取两个数字,将它们相加,然后求和的平方根。 .: alias 有点视觉上的意义,因为你可以想象冒号代表两个参数的函数连接到一个参数的函数。

如果需要,可以查看 (.) 的类型签名像这样:
(.) :: (b -> c) -> (a -> b) -> (a -> c)

这意味着 (.)接受两个函数 a -> bb -> c并“将它们连接在一起”并从 a 返回一个函数直接到 c .运营商 (.:)工作方式类似——您可以将其类型签名写为
(.:) :: (b -> c) -> (a1 -> a2 -> b) -> (a1 -> a2 -> c)

它所做的是它需要一个函数 a1 -> a2 -> b和一个功能 b -> c它给你一个直接来自 a1 的函数和 a2c .

如果你想自己验证这种类型,你可以用自己的方式去 (.:)带有 (.) 的签名.我不会为你做这件事,部分是因为它最终可能会变成一堵文字墙,部分是因为它是你推理代码的一个很好的练习!如果您需要一个起点,请记住
(.) :: (b -> c) -> (a -> b) -> (a -> c)

在表达式中
(.).(.)

也可以写成
(.) (.) (.)
(.) 的两个参数函数( a -> bb -> c )都是 (.)自己 - 所以你可以替换很多 a s 和 b s 和 c与他们真正代表的东西有关!

关于haskell - 表达式 str a b = ((.).(.)) (0 -) (+) 1 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18530745/

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