交换列表的前两个元素,(Haskell)

时间:2013-04-01 02:03:48

标签: haskell syntax-error swap

为了交换列表的前两个元素,我编写了以下代码:

swap_first_two_elements :: [a]->[a]
swap_first_two_elements list=case list of
  x:y:_ -> y:x:_
  [x] -> Nothing
  []-> Nothing

但是,终端显示如下所示的错误:

[1 of 1] Compiling Main             ( test.hs, interpreted )

test.hs:3:16: Pattern syntax in expression context: _
Failed, modules loaded: none.
Prelude> 

谁愿意告诉我它有什么问题?

顺便说一下,我还尝试将最后两行合并到:

[x] || [] ->Nothing

怎么回事?终点显示:

test.hs:4:3: Parse error in pattern: [x] || []
Failed, modules loaded: none.

谁愿意告诉我它有什么问题?谢谢XD

1 个答案:

答案 0 :(得分:7)

错误在于你不能在分支的结果中使用_。保留_以指示未使用的变量。如果要重用列表的尾部,则必须将其绑定到另一个名称:

swap_first_two_elements :: [a]->[a]
swap_first_two_elements list = case list of
  x:y:xs -> y:x:xs
  [x]    -> Nothing
  []     -> Nothing

但是,如果您编译它,您将收到另一个错误。您的案例分支返回不同类型的值。第一个分支返回类型[a]的值,但第二个和第三个分支返回类型Maybe [a]的值。要修复它,您必须将第一个分支包装在Just中(并修复您的类型签名以表明您要返回Maybe [a]而不是[a]):

swap_first_two_elements :: [a] -> Maybe [a]
swap_first_two_elements list = case list of
  x:y:xs -> Just (y:x:xs)
  [x]    -> Nothing
  []     -> Nothing

最后一项改进是,您可以通过在所有内容上使用回退模式匹配将最后两个案例分支合并为一个:

swap_first_two_elements :: [a] -> Maybe [a]
swap_first_two_elements list = case list of
  x:y:xs -> Just (y:x:xs)
  _      -> Nothing