有没有一种类似(伪代码)的结构:
test (a,b) = if a > 10 then a else null
在Haskell中。如果您在列表上进行映射,则可以使用filter
来执行此操作,但是我想要使用if then else
进行类似的构造。
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
[它遵循then
和else
分支都返回相同类型的值的规则-在这种情况下,类型为Maybe a
。
要使用谓词过滤列表,您可以像这样简单地使用filter
filter (>10) myList
但是如果值确定就可以有一个函数在输出中选择并返回值,则可以使用Maybe
类型
Maybe
然后您就可以使用此功能进行过滤了
test :: Int -> Maybe Int
test a = if a > 10 then Just a else Nothing
但是,如果您只想过滤一个值列表,那么您应该使用第一个版本,并且仅返回一个返回catMaybes
$ map test
$ myList
的谓词。>