我正在努力做到以下几点:
processRights :: [Either a Int] -> Int processRights xs = map (\Right x -> x, \Left x -> 0) xs
所以,xs是一个[Either a Int],我希望生成一个长度相同的Map列表,其中每个int都有相同的int,否则为0。我该怎么做?
xs
[Either a Int]
waxmsbnn1#
您可以使用either、id和const函数:
either
id
const
processRights :: [Either a Int] -> [Int] processRights = map $ either (const 0) id
either为任何Left运行第一个函数,为任何Right运行第二个函数。id返回其参数。const忽略它的第二个参数并返回它的第一个参数,它的预期用途是e。例如,const 0成为一个忽略其参数并仅返回0的函数。
Left
Right
const 0
wn9m85ua2#
实际上,您提出的代码非常非常接近!下面是一个工作版本,改动很小:
processRights xs = map (\case Right x -> x; Left x -> 0) xs
您需要打开LambdaCase扩展。(当然,正如其他答案中提到的,还有更多的惯用方法来实现这种效果。)
LambdaCase
cidc1ykv3#
一个清晰的方法是使用helper函数。的确:
processRights :: [Either a Int] -> [Int] processRights = map go where go (Right x) = x (Left _) = 0
这不是最简洁的方式,但它表明了正在发生的事情。您可以使用**fromRight :: b -> Either a b -> b**来简化此操作,其中我们提供要使用的值或Left x元素,因此它将选择该值或 Package 在Right数据构造函数中的值,因此:
fromRight :: b -> Either a b -> b
Left x
import Data.Either(fromRight) processRights :: Num b => [Either a b] -> [b] processRights = map (fromRight 0)
3条答案
按热度按时间waxmsbnn1#
您可以使用
either
、id
和const
函数:either
为任何Left
运行第一个函数,为任何Right
运行第二个函数。id
返回其参数。const
忽略它的第二个参数并返回它的第一个参数,它的预期用途是e。例如,const 0
成为一个忽略其参数并仅返回0的函数。wn9m85ua2#
实际上,您提出的代码非常非常接近!下面是一个工作版本,改动很小:
您需要打开
LambdaCase
扩展。(当然,正如其他答案中提到的,还有更多的惯用方法来实现这种效果。)cidc1ykv3#
一个清晰的方法是使用helper函数。的确:
这不是最简洁的方式,但它表明了正在发生的事情。您可以使用**
fromRight :: b -> Either a b -> b
**来简化此操作,其中我们提供要使用的值或Left x
元素,因此它将选择该值或 Package 在Right
数据构造函数中的值,因此: