无法将预期类型'(Int,Int)'与实际类型'[t0]'匹配

时间:2017-05-13 19:43:54

标签: haskell

为什么这会给我错误?我只是尝试这个作为测试来学习Haskell我只是在第二个输入中捆绑了元组。为什么这不编译?谢谢

test :: (Int,Int) -> [(Int,Int)] -> Int
test [] [] = []
test xs [] = []
test (x,xs) (y:ys)  =   test (x,xs) ys

感谢@Carcigenicate指出第一个错误。现在,如果我们有

test :: (Int,Int) -> [(Int,Int)] -> Int
test xs [] = []
test (x,xs) (y:ys)  =   test (x,xs) ys 

我得到了

• Couldn't match expected type ‘Int’ with actual type ‘[t0]’
• In the expression: []
  In an equation for ‘test’: test xs [] = []

1 个答案:

答案 0 :(得分:4)

你的函数签名说第一个参数应该是2个整数的元组,但是在你的第一个模式匹配行中:

test [] [] = []
      ^

您尝试将元组与列表进行匹配。

  1. 类型不匹配,因此错误。

  2. 除非它是什么类型,否则元组永远不会是空的。与列表不同,元组无法添加或删除;它们有固定的尺寸。

  3. 如果你说元组将有2个值,它将始终有2个值。无需检查它是否为空。看起来你可以摆脱那条线,因为它没有做任何合法或有用的事情。

    另请注意,您的命名有点令人困惑。通常,xxs代表集合的头部和尾部。元组不是真的有,只是不同的"插槽"。