Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
List 在haskell中编织列表_List_Haskell_Merge_Pattern Matching_Currying - Fatal编程技术网

List 在haskell中编织列表

List 在haskell中编织列表,list,haskell,merge,pattern-matching,currying,List,Haskell,Merge,Pattern Matching,Currying,例如,我试图创建一个函数来将两个列表编织在一起 [1,3,5]和[2,4]->[1,2,3,4,5] 我得到了我必须做和检查的基本原则,但我遇到了所需类型的问题 interleave :: ([a],[a]) -> [a] 给出了关于不同数量参数的错误。这是迄今为止给我的错误最少的版本 interleave ([],[]) = [] interleave (xs,[]) = [xs] interleave ([],ys) = [ys] interleave (x:xs) (y:ys)

例如,我试图创建一个函数来将两个列表编织在一起
[1,3,5]
[2,4]
->
[1,2,3,4,5]

我得到了我必须做和检查的基本原则,但我遇到了所需类型的问题

interleave :: ([a],[a]) -> [a] 
给出了关于不同数量参数的错误。这是迄今为止给我的错误最少的版本

interleave ([],[]) = []
interleave (xs,[]) = [xs]
interleave ([],ys) = [ys]
interleave (x:xs) (y:ys) = x : y : interleave xs ys
我曾经尝试过几次处理参数和输出,但我对haskell语法还不熟悉,所以我不知道我到底出了什么问题


第2部分:我还有一个测试文件来确保函数是正确的,因此,如果在这之后我对该文件仍然有问题(因为我在那里得到了类似的输入/输出不匹配,这导致我更改为我现在拥有的),我可能也会发布该代码以获得帮助

问题是您的类型签名,以及您的三个案例,都定义了一个参数的函数(类型为
([a],[a])
),但是第四个案例试图定义两个参数的函数(第一个是
x:xs
,第二个是
y:ys

解决方法是将第四种情况更改为也针对一对参数:

interleave (x:xs, y:ys) = x : y : interleave (xs, ys)

问题是,您的类型签名和三个案例都定义了一个参数的函数(类型
([a],[a])
),但第四个案例试图定义两个参数的函数(第一个是
x:xs
,第二个是
y:ys

解决方法是将第四种情况更改为也针对一对参数:

interleave (x:xs, y:ys) = x : y : interleave (xs, ys)

除非您要求只使用一个参数,否则我认为将所有情况更改为使用两个参数会更有意义:

interleave [] [] = []
interleave xs [] = xs
interleave [] ys = ys
interleave (x:xs) (y:ys) = x : y : interleave xs ys

注意,在
交错xs[]
的情况下,最初返回的是
[xs]
。这是一个包含名为
xs
的列表。相反,您应该直接返回
xs
。同样地,对于涉及
ys

的情况,除非您要求只使用一个参数,否则我认为将所有情况更改为使用两个参数会更有意义:

interleave [] [] = []
interleave xs [] = xs
interleave [] ys = ys
interleave (x:xs) (y:ys) = x : y : interleave xs ys

注意,在
交错xs[]
的情况下,最初返回的是
[xs]
。这是一个包含名为
xs
的列表。相反,您应该直接返回
xs
。同样,对于涉及
ys

的案例,您是如何使用此函数的?您得到的实际错误是什么?@ReinHenrichs我是如何使用它的?就像我猜的那样?就像制作两个列表,看看它们是否正确地组合在一起,我不是真的在其他任何东西中使用它,而是在tester文件中,它几乎只是拿两个列表,看看它是否正确地组合在一起。错误是“不同数量的论点”,这是一个你可能喜欢的可爱技巧:如果你把有趣的案例放在第一位,最后一个案例就可以将论点串联起来<代码>交织(x:xs)(y:ys)=x:y:interleave xs-ys;交织xs ys=xs++ys。与您的实现相比,当
ys
[]
时,它的成本很低,但它确实很漂亮!你是如何使用这个函数的?你得到的实际错误是什么?@ReinHenrichs我是如何使用它的?就像我猜的那样?就像制作两个列表,看看它们是否正确地组合在一起,我不是真的在其他任何东西中使用它,而是在tester文件中,它几乎只是拿两个列表,看看它是否正确地组合在一起。错误是“不同数量的论点”,这是一个你可能喜欢的可爱技巧:如果你把有趣的案例放在第一位,最后一个案例就可以将论点串联起来<代码>交织(x:xs)(y:ys)=x:y:interleave xs-ys;交织xs ys=xs++ys。与您的实现相比,当
ys
[]
时,它的成本很低,但它确实很漂亮@或者,您可以修改所有案例以采用两个参数。当然,如果要显式地给出类型签名,则需要稍有不同的类型签名。@WalterC或者,您可以修改所有案例,以采用两个参数。当然,如果要显式地提供签名,则需要稍微不同的类型签名。