2

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

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

4

1 回答 1

8

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

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

但是,如果你编译它,你会得到另一个错误。您的案例分支返回不同类型的值。第一个分支返回 type 的值[a],但您的第二个和第三个分支返回 type 的值Maybe [a]。要修复它,您必须将第一个分支包装在 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
于 2013-04-01T02:33:35.923 回答