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

问题描述 投票:0回答:2

有没有一种类似(伪代码)的结构:

test (a,b) = if a > 10 then a else null

在Haskell中。如果您在列表上进行映射,则可以使用filter来执行此操作,但是我想要使用if then else进行类似的构造。

if-statement haskell null void
2个回答
4
投票

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

您可以这样编写函数:

test (a,b) = if a > 10 then Just a else Nothing

这里是与之互动的方式:

Prelude> test (11, "foo")
Just 11
Prelude> test (10, "foo")
Nothing

函数的类型是:

test :: (Ord a, Num a) => (a, b) -> Maybe a

[它遵循thenelse分支都返回相同类型的值的规则-在这种情况下,类型为Maybe a


1
投票

要使用谓词过滤列表,您可以像这样简单地使用filter

filter (>10) myList

但是如果值确定就可以有一个函数在输出中选择并返回值,则可以使用Maybe类型

Maybe

然后您就可以使用此功能进行过滤了

test :: Int -> Maybe Int
test a = if a > 10 then Just a else Nothing

但是,如果您只想过滤一个值列表,那么您应该使用第一个版本,并且仅返回一个返回catMaybes $ map test $ myList 的谓词。>

© www.soinside.com 2019 - 2024. All rights reserved.