If statement Haskell if构造,在`else'上不返回任何内容`
有没有一种方法可以使用类似(伪代码)的构造:If statement Haskell if构造,在`else'上不返回任何内容`,if-statement,haskell,null,void,If Statement,Haskell,Null,Void,有没有一种方法可以使用类似(伪代码)的构造: 在哈斯克尔。如果映射到一个列表,我可以使用filter来执行此操作,但我希望使用If-then-elseIf…else是Haskell中的一个表达式,并且必须始终计算为一个值。此外,两个分支的计算结果必须为同一类型的值。因此,else分支必须计算为与a相同的类型才能使代码正常工作 对于过滤器,结果必须是列表。我们可以使用if…else实现filter。这里的想法是,如果条件为真,那么我们希望在结果列表中包含元素。如果没有,那么我们希望继续对列表的其余
在哈斯克尔。如果映射到一个列表,我可以使用
filter
来执行此操作,但我希望使用If-then-else
If…else
是Haskell中的一个表达式,并且必须始终计算为一个值。此外,两个分支的计算结果必须为同一类型的值。因此,else
分支必须计算为与a
相同的类型才能使代码正常工作
对于过滤器
,结果必须是列表。我们可以使用if…else
实现filter
。这里的想法是,如果条件为真,那么我们希望在结果列表中包含元素。如果没有,那么我们希望继续对列表的其余部分进行过滤
filter _ [] = []
filter f (x:xs) = if f x then (x:f xs) else f xs
请注意,在这两种情况下,结果都是一个列表。我们通过删除一个项,而不是将其包含在返回的列表中Haskell没有空引用,但这并不意味着不能对值的存在或不存在进行建模。您通常使用
Maybe
类型,数据构造函数Just
表示值,而Nothing
表示空值
您可以这样编写函数:
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
分支都返回相同类型的值-在这种情况下,类型是可能是a
要使用谓词筛选列表,您可以像这样简单地使用filter
过滤器(>10)myList
但是,如果希望有一个函数在值为ok时在输出中释放并返回值,则可以使用
test::Int->Maybe Int
测试a=如果a>10,则仅a其他无
然后你可以像这样用这个函数过滤
catMaybes
$map测试
$myList
但是,如果您只想筛选一个值列表,那么您应该使用第一个版本,其中只包含一个返回
Bool
的谓词。所有答案都很好。。我只想补充一点,提醒大家,虽然纯函数无法做到这一点,但Haskell也允许我们执行不纯正的操作,例如在IO
monad中。在那里,我们在做这些事情时更加放松
test :: (Num a, Ord a, Show a) => (a,b) -> IO ()
test (a,b) = when (a < 10) $ print a
λ> test (11,"boru") -- nothing happens
λ> test (9,"boru")
9
test::(numa,orda,Show a)=>(a,b)->IO()
测试(a,b)=当(a<10)$打印a时
λ> 测试(11,“boru”)——什么都没有发生
λ> 测试(9,“boru”)
9
有点。您将使用此结构做什么?我怀疑有另一种方法可以解决您原来的问题。@Madderote-至于纯表达式,这是不可行的,无论如何您都必须返回一些东西。但是,在动作上下文中,根据谓词的值,您可能希望执行某些操作或不执行任何操作。这是第一条,绝对没有其他条款。示例:
when(debugMode)(putStrLn$DEBUG:x=“++(show x))
基本上,您总是在if-else
块中返回某个内容,并且这两个分支中的某个内容类型相同。可能更倾向于编写test(a,u)=a 10)
@Ackdari,Mark Seemann,谢谢。我知道Maybe类型,但考虑到Nothing
也是一个值,并且如果我想获得Just
的列表,仍然需要进行筛选。我想知道的是,在某种情况下,可能会有一个值,或者实际上不会返回任何值。看起来@Popara是对的,Haskell的if-then-else构造总是返回一些东西。@Madderote我不确定我是否理解您想要做什么,但是如果您想同时map
和filter
一个列表,您可以这样做,或者您可以使用上面的test
函数map
,然后扔掉not使用
返回值。@Madderote您不能简单地不返回值。即使在Python这样的语言中,您可以编写def test(a,b):如果a>10:returna
,函数test
仍然隐式返回None
。在Haskell中,您只需明确说明您正在编写的内容。(leftaroundabout的建议只是在数据中的catMaybes
后面隐藏了Nothing
的显式返回。在我看来,
可能是映射fromJust的更好选择$filter isJust
。因为它没有使用潜在的不安全fromJust
(我很感激它在上下文中是安全的)。
test :: (Num a, Ord a, Show a) => (a,b) -> IO ()
test (a,b) = when (a < 10) $ print a
λ> test (11,"boru") -- nothing happens
λ> test (9,"boru")
9