Haskell “作为模式”;“发明地图”;示例不起作用
定义此函数:Haskell “作为模式”;“发明地图”;示例不起作用,haskell,Haskell,定义此函数: contrivedMap :: ([a] -> a -> b) -> [a] -> [b] contrivedMap f [] = [] contrivedMap f list@(x:xs) = f list x : contrivedMap f xs 当我尝试使用它时,我遇到了一个错误: > contrivedMap (*2) [1,2,3] <interactive>:4:15: error: • Couldn't match ty
contrivedMap :: ([a] -> a -> b) -> [a] -> [b]
contrivedMap f [] = []
contrivedMap f list@(x:xs) = f list x : contrivedMap f xs
当我尝试使用它时,我遇到了一个错误:
> contrivedMap (*2) [1,2,3]
<interactive>:4:15: error:
• Couldn't match type ‘[a0]’ with ‘a0 -> b’
Expected type: [a0] -> a0 -> b
Actual type: (a0 -> b) -> a0 -> b
• In the first argument of ‘contrivedMap’, namely ‘(* 2)’
In the expression: contrivedMap (* 2) [1, 2, 3]
In an equation for ‘it’: it = contrivedMap (* 2) [1, 2, 3]
• Relevant bindings include it :: [b] (bound at <interactive>:4:1)
但我该如何修复它呢
我发现它们不匹配,但我该如何修复它
您可以通过正确使用此函数来修复它
您已经定义了一个函数mapEx
,它迭代列表中的元素,并将提供的函数应用于每个元素,即。E您需要提供一个函数,该函数接受列表中的一个元素并返回一个结果。例如,(*2)
-获取一个Num
,并返回一个加倍的值
预期:
mapEx(*2)[1,2,3]
的计算结果为[2,4,6]
但是contrivedMap
功能略有不同。它还迭代列表中的元素,但提供的函数将2参数从迭代元素到末尾的元素列表和迭代元素
contrivedMap f[1,2,3]
将包含:
[(f [1,2,3] 1), (f [2,3] 2), (f [3] 3)]
因此,您需要提供一个函数,它可以正确地处理这些参数,即。E具有类型([a]->a->b)
。例如,f list x=(总和列表)*x
或只是f=(*)。总和
contrivedMap((*).sum)[1,2,3]
返回[6,10,9]
,即:
[(sum [1,2,3]) * 1, (sum [2,3]) * 2, (sum [3]) * 3]
通过选择一个匹配的函数。例如
\x->(*2)
,或者等效地const(*2)
,换句话说,我现在的理解是:当看到([a]->a->b)时,意味着ContractedMap需要一个函数,它接受类型a的列表,并返回类型a的单个值,然后取a并返回一个类型为b的值,这意味着它可能是类型a,也可能不是类型a。在[1,23]上运行的组合((*).sum)正是这样做的。我必须说,我将研究您的答复一段时间,因为我认为这是理解Haskell语法的关键。非常感谢。不,[a]->a->b
表示它接受两个参数,一个[a]
和一个a
,并返回一个b
。要学究化,它实际上需要一个[a]
并返回一个函数,该函数接受a
并返回b
。
[(sum [1,2,3]) * 1, (sum [2,3]) * 2, (sum [3]) * 3]