关于currying:功能组合 – Haskell

Function Composition - Haskell

再次,我在项目Euler问题上的尝试产生的另一个问题(从上一个问题继续)。我无法理解以下内容:

1
print (maximum (map (product . take 13) (tails number)))

明确地

1
map (product . take 13) (tails number)

来自ghci的map的第一个参数的类型签名是->c:

1
2
ghci> :t (product . take 13)
(product . take 13) :: Num c => [c] -> c

来自ghci的map (product . take 13)的类型签名是[[b]]->[b]:

1
2
ghci> :t map (product . take 13)
map (product . take 13) :: Num b => [[b]] -> [b]

我是不是说,作为map的第一个参数应该是一个函数,[[b]]不是指一个列表,而是指由(product . take 13)生成的(部分应用的)函数列表,其中部分函数的第二个参数来自(tails number)


以下是无点版本:

ZZU1

让我们更清楚一点:

ZZU1

如你所见,它首先得到数字列表的最后部分(这又是一个列表)

然后,它使用EDOCX1为每个细分市场获取产品(同样是一个列表)

最后,它搜索这些产品的EDOCX1并返回它

附言:我在两个版本中都去掉了EDOCX1-2,我认为EDOCX1-3只会使事情复杂化,这并不重要……我认为EDOCX1您可以在以后打印出来;)


BLCK1

是的,EDOCX1的第一个参数应该是一个函数。看它的类型:

ZZU1

它需要一个类型为EDOCX1到5的函数。但在您的案例中,EDOCX1指的是EDOCX1:

ZZU1

所以,这是一个函数,它获取元素EDOCX1到8的列表,并从中生成一个类型为EDOCX1到9的值。您可以在ghci中进行实际测试:

ZZU1-4型

为了简单起见,它的应用方式如下:

ZZU1墨水

EDOCX1-10是一个普通函数,类型为:

ZZU1

所以,这个函数接受一个元素列表,并给出一个元素列表。你可以在ghci玩这个游戏:

ZZU1

我希望能说清楚。