gpt4 book ai didi

function - haskell函数声明

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

我在理解 Haskell 函数的签名/参数/输入时遇到问题。在有人提示之前,是的,我已经完成了研究,但似乎找不到好的答案或解释。

基本上我有一个功能:

更新::Eq a => (a->b) -> b -> a -> (a->b)

我如何理解 (a->b) -> b -> a -> (a->b)?我认为它接受一个函数的输入,后跟 2 个值并输出一个函数??

我有 2 个不同的函数做同样的事情,一个使用 3 个参数,一个使用 4 个参数,但 header (函数的参数)是相同的。

(1)

update :: Eq a => (a->b) -> b -> a -> (a->b)
update s v x y = if x==y then v else s y

(2)

update :: Eq a => (a->b) -> b -> a -> (a->b)
update s v y = ss
where ss x = if ( x == y )
then v
else s x

它们都计算相同的东西,但我不明白为什么 (1) 使用 4 个输入“update s v xy”和(2) "update s v y"使用 3 个输入。

任何帮助将不胜感激。

最佳答案

欢迎来到美妙的柯里化(Currying)世界。

让我们从一个简单的函数开始

allEq :: Int -> Int -> Int -> Bool
allEq x y z = x == y && y == z

现在在 Haskell 中 -> 是右结合的,所以这是

allEq :: Int -> (Int -> (Int -> Bool)))
allEq x y z = x == y && y == z

allEq x y = \z -> x == y && y == z
allEq x = \y -> \z -> x == y && y == z
allEq = \x -> \y -> \z -> x == y && y == z

现在,在 Haskell 中,我们知道我们可以将表达式“提升”到 letwhere 绑定(bind)中而不更改它。

 allEq x y = foo
where foo z = x == y && y == z

这就是我们如何实现您的功能。

关于function - haskell函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23015147/

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