gpt4 book ai didi

haskell - Haskell 中的 ((+) . (+)) 是什么?

转载 作者:行者123 更新时间:2023-12-04 01:49:05 25 4
gpt4 key购买 nike

在 ghci 中,

:t ((+).(+))
> ((+).(+)) :: (Num (a -> a), Num a) => a -> (a -> a) -> a -> a

但这是什么东西?谁能给我一个使用这个的例子吗?

一个复合 2 个函数,每个函数带有 2 个参数,如何实现?
例如, (map.map) :: (a -> b) -> [[a]] -> [[b]] 如何工作?
(^.^) (-.-) (+.+) (不禁做出鬼脸。PS:我认为这意味着告诉编译器你今天的感受)

最佳答案

Num (a -> a) (或例如 Eq (a -> a) )基本上是没有任何意义的代码的指标1,但编译器仍然推断出(无意义的)类型签名。通常,当您忘记将函数应用于某个参数时,它就会出现。在这种情况下,显然 (+)需要一个“普通数字”参数才能成为一个“简单函数”,您可以将另一个这样的函数添加到该函数中。

但是,(a -> a)确实是您也可以传递的有效类型的函数,而不是数字。例如,map . (+)是一个完美的组合:

Prelude> :t map . (+)
map . (+) :: Num b => b -> [b] -> [b]
Prelude> zipWith (map . (+)) [10,20,30] [[1,2],[3,4]]
[[11,12],[23,24]]

因为 map实际上期望一个函数作为它的第一个参数。相似地,
Prelude> zipWith (map . map) [(+10),(+20),(+30)] [[[1,2],[3,4]],[[5,6]]]
[[[11,12],[13,14]],[[25,26]]]

在这里,正确的 map接受一个简单的函数(如数值增量)并返回相应的列表映射函数。然后将该函数馈送到左侧 map产生一个映射嵌套列表的函数。

1实际上,您可以通过定义来强制它有意义
instance (Num a) => Num (b -> a) where
fromInteger x = const $ fromInteger x
f + g = \x -> f x + g x

就个人而言,我不是这个的粉丝。它令人困惑,例如 let a = 3 in 4 a生产 4当大多数人期望乘以 12 .

关于haskell - Haskell 中的 ((+) . (+)) 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23825071/

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