Haskell规范:使用Maybe还是空列表?

6

有没有Haskell专家可以为我澄清一些问题:

给出一个函数match的简化示例,该函数应从列表中返回匹配的值,哪种函数定义更好使用Maybe还是返回[](空列表)?

也就是说:

match :: String -> [String] -> Maybe String

或者

match :: String -> [String] -> [String]     {- possibly empty, if no match -}

我更喜欢第一个版本,因为它更加清晰易懂,但我很想知道是否有关于这种事情的约定。

非常感谢快速回复。我已接受luqui简明的答案。 - Max
如果用户想要 [String] 但得到了 Maybe String(或反之),那么可以使用非常易于使用的 maybeToListlistToMaybe 自然变换/单子态映射,以便能够交替使用它们。 - Justin L.
3个回答

21

如果只可能返回零个或一个匹配的话,那么请使用 Maybe(因为它的含义就是这样); 如果可能返回任意数量的匹配项,则使用 [](因为它的含义也是这样)。


6
+1完美答案。用正则表达式的思维方式来看,List对应*,而Maybe则对应? - Dan Burton

2

我喜欢使用Maybe String。我认为它更加清晰易懂。如果你考虑另一种选项所传达的含义,你会发现这意味着你的函数接受一个列表并在失败时返回一个String或者一个列表。从语义上讲,与返回StringNothing相比,这有点奇怪。


0
在这种情况下,您声明如果存在单个匹配值,则返回该值。我会选择使用Maybe String,否则您将返回包含单个元素的列表,这似乎有些奇怪。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接