我是Haskell的初学者,我有一个练习,其中的想法是制作多态函数。
我想做一个函数,它接受列表和另一个参数,添加到列表中。
addA :: a -> [a] -> [a]
addA [] = []
addA (x: xs) = x + a : addA xs
在最后一行中,有一个错误显示:声明变量a不在作用域中,并且->
Couldn't match expected type: [a1]
with actual type: [[a1]] -> [[a1]]
• Probable cause: ‘addA’ is applied to too few arguments
In the second argument of ‘(:)’, namely ‘addA xs’
In the expression: x + a : addA xs
In an equation for ‘addA’: addA (x : xs) = x + a : addA xs
• Relevant bindings include
xs :: [a1]
我不知道如何在列表中的每个元素中添加输入。
2条答案
按热度按时间trnvg8h31#
当你使用没有任何高级语言扩展的普通Haskell时,编译器能够从表达式中推断出函数的类型。因此,类型注解实际上是可选的。
然后,考虑函数定义 * 没有 * 类型注解:
在这种情况下,编译器错误是 still
你现在明白为什么了吗?
bz4sfanl2#
让我们看看
addA
的签名是什么:这意味着为了调用
addA
,您需要提供 * 两个 * 参数。然而,在你的定义中:
这就是编译器所抱怨的。
如果你不确定如何正确地实现算法,但想通过类型检查,你可以使用丢弃模式(
_
):话虽如此,由于问题是要求一个多态实现,我能想到的最多态的实现是这样的:
这是多态的,因为它适用于任何数值类型
a
(Int
,Double
等)和任何函子类型f
([]
,Maybe
,Either
等),因此: