haskell中的模式匹配列表

时间:2017-07-15 10:45:13

标签: haskell

[Noob问题] 我在haskell中有一个列表,只有两个元素:

mylist = ["Apple", "Mango"]

当我尝试像这样进行模式匹配时

[firstelemet ,secondelement] = mylist;

我收到了这样的警告。

  

警告:[-Wincomplete-uni-patterns]       模式匹配并非详尽无遗       在模式绑定中:           模式不匹配:               []               []               (:_)

有关如何以更好的方式完成此任务的任何建议。实际上我需要为单元测试执行此操作,返回包含两个元素的列表。

2 个答案:

答案 0 :(得分:2)

当教人们使用基于ML的语言进行单元测试时,我经常会遇到如何验证monadic值的问题。那你在这里想做什么?

问题通常是变体:

如何从monad中获取值?

我的回答通常是:

你没有。你走进了monad。

你想做这样的事吗?

assertEquals "Apple" firstelement
assertEquals "Mango" secondelement

在这里,我假设你有某种assertEquals功能...

如果是这样,当元素为Eq时,有助于认识到Haskell列表是Eq,所以相反,你可以写下这样的东西:

assertEquals ["Apple", "Mango"] mylist

如果这对你不起作用,你可以引入一个像这样的辅助函数:

tryPair :: [a] -> Maybe (a, a)
tryPair [x, y] = Just (x, y)
tryPair _      = Nothing

这将使您能够首先执行此操作:

m = tryPair mylist
如果Maybe aEq,则

a也为Eq,因此您可以这样写下您的断言:

assertEquals (Just ("Apple", "Mango")) m

如果这个仍然不适合你,也许你可以编写一个这样的测试实用程序函数:

assertJust :: Maybe a -> (a -> ()) -> ()
assertJust (Just x) f = f x
assertJust Nothing _ = assertFail "Boo! Nothing!"

这可以让你写下这样的东西:

assertJust (tryPair mylist) $ \(x, y) -> assertEquals "Apple" x

答案 1 :(得分:0)

您可以将其写为

mylist = ["Apple", "Mango"]
firstelement : secondelement : _ = mylist

获得你想要的确切内容,尽管这里建议的其他方法在概念上可能更好。请注意,这仅适用于至少包含2个元素的列表。