Haskell if-construct 在 `else` 上不返回任何内容

Mad*_*ote 0 null haskell if-statement void

有没有办法像(伪代码)这样​​的构造:

test (a,b) = if a > 10 then a else null
Run Code Online (Sandbox Code Playgroud)

在哈斯克尔。如果您映射一个列表,我可以使用它filter来执行此操作,但我希望使用if then else.

Mar*_*ann 9

Haskell 没有空引用,但这并不意味着您不能对值的存在或不存在进行建模。您通常Maybe为此使用类型,将数据构造函数Just用于值而Nothing不是 null。

你可以这样写你的函数:

test (a,b) = if a > 10 then Just a else Nothing
Run Code Online (Sandbox Code Playgroud)

以下是与它交互的方法:

Prelude> test (11, "foo")
Just 11
Prelude> test (10, "foo")
Nothing
Run Code Online (Sandbox Code Playgroud)

函数类型为:

test :: (Ord a, Num a) => (a, b) -> Maybe a
Run Code Online (Sandbox Code Playgroud)

它遵守 thethenelsebranch 都返回相同类型的值的规则——在这种情况下,类型是Maybe a

  • @Madderote你不能简单地“不”返回一个值。即使在像 Python 这样的语言中,您可能会编写“def test(a, b): if a > 10: return a”,函数“test”*仍然*隐式返回“None”。在 Haskell 中,你只需要明确你所写的内容即可。(leftaroundabout 的建议只是将 `Nothing` 的显式返回隐藏在 `<$` 运算符和 `guard` 函数后面。) (2认同)