gpt4 book ai didi

haskell - haskell中 "either"类型构造函数有什么用

转载 作者:行者123 更新时间:2023-12-02 16:15:33 29 4
gpt4 key购买 nike

在研究 haskell 的类型系统时,我遇到了名为“Either”的类型构造函数。一个用例是下面的代码

import qualified Data.Map as Map  

data LockerState = Taken | Free deriving (Show, Eq)
type Code = String
type LockerMap = Map.Map Int (LockerState, Code)


lockerLookup :: Int -> LockerMap -> Either String Code
lockerLookup lockerNumber map =
case Map.lookup lockerNumber map of
Nothing -> Left $ "Locker number "
++ show lockerNumber ++ " doesn't exist!"
Just (state, code) -> if state /= Taken
then Right code
else Left $ "Locker " ++ show lockerNumber
++ " is already taken!"


lockers :: LockerMap
lockers = Map.fromList
[(100,(Taken,"ZD39I"))
,(101,(Free,"JAH3I"))
,(103,(Free,"IQSA9"))
,(105,(Free,"QOTSA"))
,(109,(Taken,"893JJ"))
,(110,(Taken,"99292"))
]

带有示例函数调用:

> lockerLookup 101 lockers

我想知道为什么不直接删除 LeftRight 值构造函数。该代码仍然可以正常工作,同时仍然能够打印出我们想要的值。

最佳答案

Eithertagged union [wiki] 。这意味着它可以从(在本例中)两种类型中获取值。如果Code例如不是字符串,您的函数将需要某种总和类型。否则它将如何传达 CodeStringEither因此,例如在可以包含 Int 的列表中使用和 String号:[Either Int String] .

Either经常用于封装可能失败的计算。 Left然后构造函数存储错误消息/异常参数,而 Right数据构造函数存储成功计算的结果。

此逻辑编码在 instance Monad Either [src] 中,确实:

instance Monad (Either e) where
Left l >>= _ = Left l
Right r >>= k = k r

所以在这里我们可以定义一个计算:

some_computation :: Val<sub>1</sub> -> Either Err Val<sub>4</sub>
some_computation v<sub>1</sub> = do
v<sub>2</sub> <- some_computation_that_can_fail<sub>1</sub> v<sub>1</sub>
v<sub>3</sub> <- some_computation_that_can_fail<sub>1</sub> v<sub>2</sub>
some_computation_that_can_fail v<sub>2</sub> v<sub>3</sub>

在这个假设的示例中,函数的类型为 some_computation_that_can_fail<sub>1</sub> :: Val<sub>1</sub> -> Either Err Val<sub>2</sub> , some_computation_that_can_fail<sub>2</sub> :: Val<sub>2</sub> -> Either Err Val<sub>3</sub>some_computation_that_can_fail<sub>1</sub> :: Val<sub>2</sub> -> Val<sub>3</sub> -> Either Err Val<sub>4</sub> .

这里如果some_computation_that_can_fail<sub>1</sub> v<sub>1</sub>返回 Left err ,然后 some_computation v<sub>1</sub>将返回 Left err 。另一方面,如果它返回 Right result ,然后v<sub>2</sub>将访问该结果,因此您可以进一步处理 resultsome_computation_that_can_fail<sub>2</sub> v<sub>2</sub> ,等等。

关于haskell - haskell中 "either"类型构造函数有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56920926/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com