Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使multiplyList工作?Haskell参考号:https://en.wikibooks.org/wiki/Haskell/Lists_II_Haskell - Fatal编程技术网

如何使multiplyList工作?Haskell参考号:https://en.wikibooks.org/wiki/Haskell/Lists_II

如何使multiplyList工作?Haskell参考号:https://en.wikibooks.org/wiki/Haskell/Lists_II,haskell,Haskell,我正在练习在GHCi中使用applyToIntegers的multiplyList函数。我想让它把一个列表乘以2。下面是我尝试过的和我得到的错误。为方便起见,下面是清单二的摘录 列表II中的代码编译正常。我的问题是:我应该把乘法器放在代码的什么地方 我可以单独使用applyToIntegers,我可以使用map复制它的功能。我无法从multiplyList连接到applyToIntgers 这是我从优秀的Haskell wikibook学习Haskell(上个月我从未听说过!)的第一篇文章,我必

我正在练习在GHCi中使用
applyToIntegers
multiplyList
函数。我想让它把一个列表乘以2。下面是我尝试过的和我得到的错误。为方便起见,下面是清单二的摘录

列表II中的代码编译正常。我的问题是:我应该把乘法器放在代码的什么地方

我可以单独使用
applyToIntegers
,我可以使用
map
复制它的功能。我无法从
multiplyList
连接到
applyToIntgers

这是我从优秀的Haskell wikibook学习Haskell(上个月我从未听说过!)的第一篇文章,我必须说Haskell是我遇到过的最漂亮的高级编程语言

applyToIntegers :: (Integer -> Integer) -> [Integer] -> [Integer]
applyToIntegers _ [] = []
applyToIntegers f (n:ns) = (f n) : applyToIntegers f ns
-- E.g., applyToIntegers (2*) [1..5] = [2,4,6,8,10], also
-–  map (2*) [1..5] = [2,4,6,8,10]

-- Unable to come up with a working example:
multiplyList :: Integer -> [Integer] -> [Integer]
--multiplyList m = applyToIntegers ((*) m) -- Compiles OK.
-- If I try:
multiplyList m = applyToIntegers ((2*) m)
我得到以下信息:

*Main> :l ods.hs
[1 of 1] Compiling Main             ( ods.hs, interpreted )

ods.hs:15:35: error:
    • Couldn't match expected type ‘Integer -> Integer’
                  with actual type ‘Integer’
    • Possible cause: ‘2 *’ is applied to too many arguments
      In the first argument of ‘applyToIntegers’, namely ‘((2 *) m)’
      In the expression: applyToIntegers ((2 *) m)
      In an equation for ‘multiplyList’:
      multiplyList m = applyToIntegers ((2 *) m)
Failed, modules loaded: none.
Prelude>

我们需要一个函数,它接受任何其他适当的函数并应用
列表元素的给定函数:

applyToIntegers :: (Integer -> Integer) -> [Integer] -> [Integer]
applyToIntegers _ [] = []
applyToIntegers f (n:ns) = (f n) : applyToIntegers f ns
使用
applyToIntegers
,我们可以获取任何
Integer->Integer
函数并应用 它是一个整数列表的元素。因此,我们可以使用这个广义的 用于重新定义multiplyList的函数:

multiplyList :: Integer -> [Integer] -> [Integer]
multiplyList m = applyToIntegers ((*) m)
它使用带有单个初始参数的
(*)
函数来创建新的 函数,该函数准备再接受一个参数(在本用例中, 将来自给定列表中的数字)


multiplyList的类型签名:

Integer->[Integer]->[Integer]

表示它接受一个整数,一个整数列表,然后返回一个整数列表

因此,multiplyList的目的是获取将列表乘以的参数

如果我们想乘以2,使用multiplyList的定义:

multiplyList m=applyToIntegers((*)m)

我们可以调用
多列表2[1..3]==[2,4,6]

如果我们简单地将定义转换为

multiplylistnxs=applyToIntegers(\x->x*n)xs

这与前面的定义完全相同,只是以一种您可能更容易理解的方式编写

这表示multiplyList接受一个整数
n
,和一个列表
xs
,并将一个乘以
n
的函数和列表
xs
传递给applyToIntegers

applyToIntegers
然后将该乘法函数应用于列表中的每个项目

总之,只需使用要乘以的值调用
multiplyList
。如果您愿意,我们可以将其分离为单独的函数:

multiplyListByTwo xs=multiplylist2xs

可以将其缩减为
multiplyListByTwo=multiplylist2

然后我们可以在任何列表上使用这个函数,值将乘以2


multiplyListByTwo[1..3]
将给出
[2,4,6]

一切都是关于咖喱
(*)
是一个带有签名的函数
Integer->Integer->Integer
(*)2)
生成一个带有签名的函数
Integer->Integer
,您可以将其应用于第二个数字并获得产品。此函数提供给
applyToIntegers
,以生成一个函数
multiplyList
,该函数将列表作为参数。您还可以将
multiplyList
视为一个函数,该函数包含两个参数,
m
,它是一个数字(例如2)和一个列表

因此,编译器消息非常简单,它告诉您
applyToIntegers
需要一个函数(*)2,但您提供了一个数字(2*m)。你必须这样称呼它

multiplylist2[1,2,3]


就像本书前一章中的示例一样。同一个函数只是以另一种方式重写,其中参数是隐式的,“高阶”样式…

让我们看看这两个函数的定义

applyToIntegers :: (Integer -> Integer) -> [Integer] -> [Integer]
multiplyList :: Integer -> [Integer] -> [Integer]
现在函数的返回类型是some[Integer]。现在

multiplyList m = applyToIntegers ((2*) m)
从右到左,我们看到ApplyToInteger需要2个参数,但给定1。()中的表达式是calculate,然后作为结果返回

multiplyList m = applyToIntegers (2*) m
在这一点上,我们现在的类型m是[Integer],multiplyList需要一个参数而不是2重写multiplyList的定义

multiplyList ::[Integer] -> [Integer]
结果:

applyToIntegers :: (Integer -> Integer) -> [Integer] -> [Integer]
applyToIntegers _ [] = []
applyToIntegers f (n:ns) = (f n) : applyToIntegers f ns

multiplyList :: [Integer] -> [Integer]
multiplyList m = applyToIntegers ((2*) m)

如果您从标题中删除该URL,而将其放在问题正文中,作为一个实际的可点击链接,您的问题可能会看起来更好一些。您已经在那里找到了答案。正如错误所述,您对太多参数应用了
(*)
。用
2
替换
m
。你的回答非常简单,我脸上露出了灿烂的笑容!非常感谢所有回复的人。虽然没有显示,但我对这个答案表示了“喜欢”。这有助于我了解Haskell是如何从等式左侧获取缺失的整数作为multiplyList中的参数的,在我看来,它似乎只需要一个参数,即“m”。Haskell中的每个函数实际上“需要一个参数”,并可能返回另一个函数,该函数将接受另一个参数。因此,您可以将
multiplyList
看作是一个函数,它接受一个数字并返回一个接受列表的函数,或者是一个函数,它接受一个数字和一个列表。部分应用是哈斯克尔的面包和黄油。