Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
haskell高阶函数中的映射和类型问题_Haskell - Fatal编程技术网

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

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只是简单地向第一个元素添加1,但我希望它映射到所有元素,而第二个元素得到一个类型错误。我想知道如何解决这些问题。 '''

预期的行为应该是

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