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]