gpt4 book ai didi

Haskell:翻转 curry 美元运算符

转载 作者:行者123 更新时间:2023-12-03 15:23:56 24 4
gpt4 key购买 nike

假设我定义了这个函数:

f = ($ 5)

然后我可以应用它:
> f (\x -> x ^ 2)
25

它的类型是:
:t f
f :: (Integer -> b) -> b

这是有道理的,它获取一个函数作为参数,并返回此函数应用于 Integer 5 .

现在我定义这个函数:
g = flip f

我认为这没有意义,因为 f是单个参数的函数。

但是,检查它的类型:
:t g
g :: b -> (Integer -> b -> c) -> c

所以现在 g是 2 个参数的函数!

将其应用于某些值:
> g [2, 4, 6] (\x y -> x:y)
[5,2,4,6]

这里发生了什么? flip ($ 5) 是什么意思真正的意义?

最佳答案

遵循以下类型:

($ 5) :: (Int -> a) -> a
flip :: (x -> y -> z) -> y -> x -> z

但是自从 ->是右结合,类型 x -> y -> z相当于 x -> (y -> z) , 所以
flip  :: (x         -> (y -> z)) -> y -> x -> z
($ 5) :: (Int -> a) -> a

所以 x ~ (Int -> a)(y -> z) ~ a ,所以代入:
($ 5) :: (Int -> (y -> z)) -> (y -> z)

并简化
($ 5) :: (Int -> y -> z) -> y -> z

所以
flip ($ 5) :: y -> (Int -> y -> z) -> z

这相当于您看到的类型(尽管我使用 Int 而不是 Integer 来节省输入)。

这就是说 ($ 5) 的类型传递给 flip 时变得特化这样它就需要一个有 2 个参数的函数。拥有像 ($ 5) const 这样的东西是完全有效的。 , 其中 const :: a -> b -> a($ 5) const :: b -> Int .全部 ($ 5)正在申请 5作为函数的参数,不一定是函数的参数。这是部分应用的示例,其中并非所有参数都提供给函数。这就是为什么你可以做 map (subtract 1) [1, 2, 3] 之类的事情。 .

如何使用 flip ($ 5) 的示例是:
> flip ($ 5) 2 (**)
25.0
> flip ($ 5) 1 (-)
4.0
> let f x y = (x, y)
> flip ($ 5) 1 f
(5, 1)

关于Haskell:翻转 curry 美元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30245108/

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