Haskell高阶函数中的映射和类型问题



我有一个高阶函数,如下所示。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中删除模式匹配。

希望对:)有所帮助

最新更新