[Noob问题] 我在haskell中有一个列表,只有两个元素:
mylist = ["Apple", "Mango"]
当我尝试像这样进行模式匹配时
[firstelemet ,secondelement] = mylist;
我收到了这样的警告。
警告:[-Wincomplete-uni-patterns] 模式匹配并非详尽无遗 在模式绑定中: 模式不匹配: [] [] (:::_)
有关如何以更好的方式完成此任务的任何建议。实际上我需要为单元测试执行此操作,返回包含两个元素的列表。
答案 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 a
为Eq
,则 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个元素的列表。