Haskell 列表推导中可以使用 if 结构吗?
Can if-structures be used in Haskell list comprehensions?
是否可以在列表理解中使用某种 if
语句来确定列表中每个元素的多个结果之一?
假设我对包含 0
或 1
.
元素的列表有一个列表理解
如果值是一个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
是否可以在列表理解中使用某种 if
语句来确定列表中每个元素的多个结果之一?
假设我对包含 0
或 1
.
如果值是一个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