Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement Haskell if构造,在`else'上不返回任何内容`_If Statement_Haskell_Null_Void - Fatal编程技术网

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