首页 > 解决方案 > 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

标签: haskell

解决方案


g在第一个版本中f1不使用b. 在您hof对该参数的定义中,递归发生在哪里。如果您不使用该参数,您将不会遍历列表。

至于 的类型错误f2:仔细看 的类型(++),需要的功能hof和你说的f2应该有的类型。我怀疑如果你删除你的类型签名,你所拥有的将会编译。然后你可以使用 GHCi 来询问推断的类型f2

f2在测试之前删除模式匹配可能是个好主意。

希望有帮助:)


推荐阅读