Haskell 与数据类型相反

Haskell 与数据类型相反,haskell,Haskell,因此,可能数据类型的定义如下: data Maybe a = Just a | Nothing 在概念上与相反的数据类型可以称为什么 data <Type> = Okay | Error String data=OK |错误字符串 也就是说,一个声明计算成功或保留计算产生的某些错误的类型。您的相当于任一字符串(),因此您可以 type CanError = Either String () isOkay :: CanError -> Bool isOkay = Data

因此,
可能
数据类型的定义如下:

data Maybe a = Just a | Nothing
在概念上与
相反的数据类型可以称为什么

data <Type> = Okay | Error String
data=OK |错误字符串
也就是说,一个声明计算成功或保留计算产生的某些错误的类型。

您的
相当于
任一字符串()
,因此您可以

type CanError = Either String ()

isOkay :: CanError -> Bool
isOkay = Data.Either.isRight

isError :: CanError -> Bool
isError = Data.Either.isLeft

getErrorMsg :: CanError -> Maybe String
getErrorMsg (Left msg) = Just msg
getErrorMsg _ = Nothing

您可以使用
任一字符串作为Monad/Applicative/Functor,但不能使用
CanError
,因为它具有种类
*
,而不是每个类型类所需的
*->*
。我建议只按原样使用
任一字符串
,因为您获得了Monad/Applicative/Functor/etc的额外功能,当您需要与
CanError
等效的字符串时,只需将返回类型设置为
任一字符串()
串联即可。

我会使用
任一字符串()
,使用一种常见的约定,即使用
左侧
中的信息和
右侧
中的成功值来表示错误。如果实际没有成功值,请使用单位类型
()


当然,这仍然需要包装在一些单子中,因为在Haskell中,没有结果的纯函数是没有用处的。如果函数的目的只是检查某些数据的有效性,那么返回错误字符串并不是错误,我会继续使用
Maybe
我反驳这样一个前提,即这种类型在意义上与
Maybe
相反。我也不同意将
一般理解为一种错误信号类型——这只是一种非常自然的使用方式,因为它的monad实例的工作方式

Maybe
Maybe
都对错误/失败一无所知–它们只是总和类型抽象概念的实现(在
Maybe
单位类型总和的情况下)

在我看来,您应该使用
或者String
来实现此目的,或者如果您喜欢显式:

type ErrorMsg = String
type PossibleError = Maybe ErrorMsg

另一个可能是你问题背后的一般想法的例子,即成功是例外情况,失败是正常情况,是
EitherR
,如中所述,其
Monad
实例建议称为“成功”Monad。顾名思义,这里没有什么魔力,它只是一个交换了
Monad
实例的
newtype
。然而,这种解释很有趣


你可以在这样一个世界里进行编程,在这样一个世界里,成功失败了,错误依然存在。正如软件包文档所示,这在处理异常处理程序堆栈时非常方便。

我只想指出,此数据类型相当于
任意字符串()
,其中
ok=Right()
Error=Left
。是的,我知道这一点。不过,我对一个更具描述性的名称感兴趣。我认为
other
是一种非常有名的类型,任何Haskell程序员看到
other String()
类型都会立即理解它的用途。使用不同的名称可能只会使代码更难理解。@HaithamGad然后给它一个类型别名。标准的做法是使用
来指示可能出现的故障以及错误值。如果你有
type ErrorMsg=String
,那么
foo::a->ErrorMsg b
,每个Haskeller都会立即理解
foo
的目的。不管它是如何实现的,我只对该类型的好名字感兴趣
或者
可能是惯用的,但这里的名称并不理想。