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