haskell 将Either列表Map到整数

rseugnpd  于 2023-04-30  发布在  其他
关注(0)|答案(3)|浏览(169)

我正在努力做到以下几点:

processRights :: [Either a Int] -> Int
processRights xs = map (\Right x -> x, \Left x -> 0) xs

所以,xs是一个[Either a Int],我希望生成一个长度相同的Map列表,其中每个int都有相同的int,否则为0。
我该怎么做?

waxmsbnn

waxmsbnn1#

您可以使用eitheridconst函数:

processRights :: [Either a Int] -> [Int]
processRights = map $ either (const 0) id

either为任何Left运行第一个函数,为任何Right运行第二个函数。
id返回其参数。
const忽略它的第二个参数并返回它的第一个参数,它的预期用途是e。例如,const 0成为一个忽略其参数并仅返回0的函数。

wn9m85ua

wn9m85ua2#

实际上,您提出的代码非常非常接近!下面是一个工作版本,改动很小:

processRights xs = map (\case Right x -> x; Left x -> 0) xs

您需要打开LambdaCase扩展。(当然,正如其他答案中提到的,还有更多的惯用方法来实现这种效果。)

cidc1ykv

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数据构造函数中的值,因此:

import Data.Either(fromRight)

processRights :: Num b => [Either a b] -> [b]
processRights = map (fromRight 0)

相关问题