Haskell 列表推导中可以使用 if 结构吗?

Can if-structures be used in Haskell list comprehensions?

是否可以在列表理解中使用某种 if 语句来确定列表中每个元素的多个结果之一?

假设我对包含 01.

元素的列表有一个列表理解

如果值是一个0,那么字符串"off"需要存储在另一个列表的相同位置。如果值为 1"on".

这只是一个例子。它看起来很容易用递归完成,但是如果这需要在列表列表上完成怎么办?还是列表的列表?

是的,在带有守卫的单例列表中使用互斥测试:

foo :: (Num a, Eq a) => [a] -> [String]
foo xs = [s | x <- xs, s <- ["off" | x==0] ++ ["on" | x==1]]

或者您可以直接使用 if 表达式,

bar :: (Num a, Eq a) => [a] -> [String]
bar xs = [s | x <- xs, let s = if x==0 then "off" else "on"]

这回答了您的具体问题。

是的,你当然可以:

on_or_off_list xs = [if x == 0 then "off" else "on" | x <- xs]

或者更无意义的风格:

on_or_off 0 = "off"
on_or_off _ = "on"
on_or_off_list = map on_or_off