提问人:coderodde 提问时间:4/15/2023 最后编辑:cafce25coderodde 更新时间:4/15/2023 访问量:39
无法通过模式匹配实现自定义运算符
Cannot implement a custom operator via pattern matching
问:
基本上,我需要一个接受两个列表并尝试返回包含两个输入列表的 head 元素的 2 列表的函数。几种极端情况:如果两个输入列表都是空的,则结果必须是空列表。如果只有一个列表不为空,则必须返回其 head 元素,并将其包装在列表中。
到目前为止,我已经尝试过这个:
(+|+) :: [a] -> [a] -> [a]
+|+ [] [] = []
+|+ (x : _) [] = [x]
+|+ [] (y : _) = [y]
+|+ (x : _) (y : _) = [x, y]
现在,当我如上所述声明运算符时,Haskell:
我在这里做错了什么?
答:
3赞
Daniel Wagner
4/15/2023
#1
运算符被定义为中缀。
[] +|+ [] = []
如果你真的想使用前缀形式,你可以把它括在括号里,就像其他地方的前缀形式需要一样。
(+|+) [] [] = []
对于定义,您可以考虑:
xs +|+ ys = [xs, ys] >>= take 1
评论
0赞
chi
4/15/2023
@coderodde 也许这与 的问题相同,其中 Haskell 无法推断空列表的确切类型,但需要这样做才能打印它(空的字符列表是一个字符串并打印为 ,一个空的 ints 列表打印为 )。尝试提供显式类型,如 中所示。print []
""
[]
print ([] +|+ [] :: [Int])
0赞
cafce25
4/15/2023
@coderodde这是一个不同的问题,应该问......惊喜。。。在另一个 Stack Overflow 问题中,如果它还没有在这里。
评论