我有一个高阶函数,如下所示。F1 只是将 1 添加到第一个元素,但我希望它映射到所有元素,第二个元素出现类型错误。我想知道如何解决这些问题。 '''
hof :: a -> (a->a->a) -> [a] -> a
hof x _ [] = x
hof x f (y:ys) = f y (hof x f ys)
f1 :: (Num a)=> [a] -> a
f1 xs = hof 0 g xs
where g a b = 1 + a
f2 :: [a] -> [a]
f2 (x:xs) = hof [] (++) (x:xs)
预期行为应为
f1 [] = 0
f1 x:xs = 1 + f1 xs
f2 [] = []
f2 (x:xs) = x ++ f4 xs
f1
的第一个版本中g
不使用b
。在你对hof
的定义中,该参数是递归发生的地方。如果不使用该参数,则不会遍历列表。
至于f2
的类型错误:仔细查看(++)
的类型,hof
所需的函数以及您所说的f2
应该具有的类型。我怀疑如果你删除你的类型签名,你所拥有的东西会编译。然后你可以使用 GHCi 来请求f2
的推断类型。
在进行测试之前,最好从f2
中删除模式匹配。
希望对:)有所帮助