haskell高阶函数中的映射和类型问题
我有一个高阶函数,如下所示。F1只是简单地向第一个元素添加1,但我希望它映射到所有元素,而第二个元素得到一个类型错误。我想知道如何解决这些问题。 ''' 预期的行为应该是haskell高阶函数中的映射和类型问题,haskell,Haskell,我有一个高阶函数,如下所示。F1只是简单地向第一个元素添加1,但我希望它映射到所有元素,而第二个元素得到一个类型错误。我想知道如何解决这些问题。 ''' 预期的行为应该是 f1 [] = 0 f1 x:xs = 1 + f1 xs f2 [] = [] f2 (x:xs) = x ++ f4 xs 第一个版本的f1中的g不使用b。在您对hof的定义中,该参数是递归发生的地方。如果不使用该参数,则不会迭代列表 至于f2的类型错误:仔细查看(++)的类型、hof所需的函数以及您所说的f2应该具有
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
中删除模式匹配
希望能有所帮助:)你的
hof
基本上接受了[a]
并产生了a
。您不能在未更改的情况下使用它,并将[a]
转换为[a]
。如果hof
的类型为foldr
,这是可能的,因为结果不必是a
。我现在无法检查这一点,但如果您在问题中包含完整的错误消息,这将非常有帮助。PS您的hof
只是foldr
的一种受限形式,参数的顺序不同-此函数在Haskell中随处可见,因此我建议您熟悉它,而不是使用自己的版本。从f2中删除类型签名会产生以下错误*Main>f2[1,2,3][1,2,3]:22:1:错误:*无法将预期类型[Integer]->t'与实际类型[a0]'.*函数f2'应用于两个参数,但其类型[[a0]->[a0]'在表达式中只有一个:f2[1,2,3][1,2,3]在'it'的等式中:it=f2[1,2,3][1,2,3]*相关绑定包括它::t(绑定时间:22:1)这不是一个糟糕的类型错误,我们并不总是那么幸运地遇到GHC:D。首先,f2
需要一个列表,而不是两个。其次,f2
的推断类型在错误消息中:[[a0]->[a0]
f1 [] = 0
f1 x:xs = 1 + f1 xs
f2 [] = []
f2 (x:xs) = x ++ f4 xs