gpt4 book ai didi

functional-programming - Haskell 函数定义语法

转载 作者:行者123 更新时间:2023-12-04 08:42:48 66 4
gpt4 key购买 nike

我正在通过以下方式进行列表连接(例如,使用 GHC):

myConcat :: [[a]] -> [a]
myConcat xs = foldr (++) [] xs
myConcat = foldr (++) []

有人可以向我解释一下上述定义为什么以及如何工作,而这个没有:
myConcat xs = foldr (++) []

是故意不允许最后一行代码(由于结构可能会变得困惑,它无用等原因)还是更深层次的东西,可能与currying有关......

我希望我能对此有所了解,这真的让我很困惑:/

后期编辑:除了下面给出的解释之外,我发现关于此事的一个很好的信息来源是 "Partial function application and currying" 部分。从章。 4 “函数式编程”来自本书 "Real World Haskell" .该书可在线免费获取。

最佳答案

让我们回顾一下不同的版本:

myConcat xs = foldr (++) [] xs

这是通常的方式,提供一个参数,由 foldr 使用。 .类型为 [[a]] -> [a] , 因为我们有一个类型为 [[a]] 的参数在左侧,产生 [a]当喂到右侧时。
myConcat = foldr (++) []

这里 foldr部分应用,所以我们返回一个函数,它可以接受一个额外的参数,一个列表列表。所以我们从右边得到的已经是我们需要的了,它不是“句法糖”,而是和第一个版本一样的另一种表达方式。类型又是 [[a]] -> [a] : 我们左边什么都没有,但是在右边给回那个签名的函数。
myConcat xs = foldr (++) []

这里 foldr也部分应用,我们返回一个可以像以前一样接受参数的函数,但我们的定义有一个额外的参数 xs , 右侧没有使用。编译器不“知道”我们想要将这个参数应用于右侧。类型为 t -> [[a]] -> [a] .为什么?

假设你有一个平方函数:
sqr :: Int -> Int 
sqr x = x*x

您所做的基本上与提供一个未使用的附加参数相同:
sqr:: Int -> t -> Int 
sqr x y = x*x

该功能仍然“有效”,例如 sqr 3 "bla"产生 9,但类型签名已关闭,未使用的参数是……呃,未使用。未使用的参数没有固定的类型,因为它实际上可以是“任何东西”,没关系。所以它在签名中获取类型变量( t )。

关于functional-programming - Haskell 函数定义语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6786230/

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