如果 Haskell 中出现错误,如何提取 Either's Right 并保留有关其 Left 的信息?
How to extract a Either's Right and keep information about its Left in case of error in Haskell?
我正在尝试提取 Either
值的 Right
构造函数中的值,同时如果所讨论的 Either
实际上是 Left
则给出错误(即错误)。 Either Right Left how to read value 中的答案是这样的:
fromRight e = either (const $ error "Either Left encountered while expecting Right") id e
这有效,但丢弃了 Either
的 Left
构造函数的错误消息中的有用信息。我怎样才能 post 一条关于 Left
的错误消息呢?
-- 编辑--
感谢您的投入。我想要这个作为 fromJust
.
的更多信息版本
此外,我想避免每次都写 case
语句,并希望在不太复杂的情况下避免使用 Monads(以保持函数 "eval" 风格)。对于我的用例,它是面向计算的,只有在提供无效输入之类的东西时(没有补救措施时)才会发生错误。
我最终使用了:
fromRight e = either (error.show) id e
不要在 either
的第一个参数中使用 const ...
,而是使用其他参数。
either oops .... where
oops x = error $ "Oops! Got an " ++ show x
或者随便什么。
但是请注意,error
应该只用于 内部 错误。应该允许用户错误、连接错误等冒泡到 IO
,然后用 throwIO
报告或妥善处理。
而不是
const $ error "Left encountered"
您可以使用 lambda 获取值并使用它,例如
\v -> error $ "Left encountered: " ++ v
我正在尝试提取 Either
值的 Right
构造函数中的值,同时如果所讨论的 Either
实际上是 Left
则给出错误(即错误)。 Either Right Left how to read value 中的答案是这样的:
fromRight e = either (const $ error "Either Left encountered while expecting Right") id e
这有效,但丢弃了 Either
的 Left
构造函数的错误消息中的有用信息。我怎样才能 post 一条关于 Left
的错误消息呢?
-- 编辑--
感谢您的投入。我想要这个作为 fromJust
.
此外,我想避免每次都写 case
语句,并希望在不太复杂的情况下避免使用 Monads(以保持函数 "eval" 风格)。对于我的用例,它是面向计算的,只有在提供无效输入之类的东西时(没有补救措施时)才会发生错误。
我最终使用了:
fromRight e = either (error.show) id e
不要在 either
的第一个参数中使用 const ...
,而是使用其他参数。
either oops .... where
oops x = error $ "Oops! Got an " ++ show x
或者随便什么。
但是请注意,error
应该只用于 内部 错误。应该允许用户错误、连接错误等冒泡到 IO
,然后用 throwIO
报告或妥善处理。
而不是
const $ error "Left encountered"
您可以使用 lambda 获取值并使用它,例如
\v -> error $ "Left encountered: " ++ v