与Maybe数据类型相反

时间:2016-04-27 18:03:07

标签: haskell

所以Maybe数据类型定义如下:

data Maybe a = Just a | Nothing

您认为概念上与Maybe相反的数据类型是什么:

data <Type> = Okay | Error String

即,一种声明计算成功的类型或者保存计算产生的一些错误。

4 个答案:

答案 0 :(得分:7)

我驳斥了这种类型与Maybe“相反”的意义上的前提。我也不同意Either通常应被理解为错误信号类型 - 由于其monad实例的工作方式,这是一种非常自然的使用方式。

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

国际海事组织,您应该为此目的使用Maybe String,或者如果您愿意明白:

type ErrorMsg = String
type PossibleError = Maybe ErrorMsg

答案 1 :(得分:4)

我会使用Either String (),使用Either来表示Left中的信息和Right中的成功值的错误信号。如果您实际上没有成功值,请使用单位类型()

当然,仍然需要将其包装在一些monad中,因为在Haskell中,没有结果的纯函数是没有用的。如果你的函数的目的只是检查某些数据的有效性,那么返回错误字符串并不是错误,我会回到使用Maybe

答案 2 :(得分:2)

您的<Type>相当于Either String (),因此您可以

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

您可以将Either String用作Monad / Applicative / Functor,但不能CanError,因为它们具有*种类,而不是* -> *,因为每个类型类都需要。我建议只使用Either String,因为你获得了Monad / Applicative / Functor /等的额外功能,当你需要等效的CanError时,返回类型为Either String ()在线。

答案 3 :(得分:2)

另一个例子可能是你的问题背后的一般想法,即成功是例外情况,失败是正常情况,EitherR Monad提供newtype Monad实例被暗示称为&#34;成功&#34;单子。顾名思义,这里没有任何魔力,它只是#!/usr/bin/python import time import gdata.spreadsheet.service email = 'mymailid@gmail.com' password = 'mypass' spreadsheet_key = '1k7XK1FzGcdLdQXs8hfLn6pdWcNZiesmW6Y5eOdxtDwE' worksheet_id = 'od6' spr_client = gdata.spreadsheet.service.SpreadsheetsService() spr_client.email = email spr_client.password = password try : spr_client.ProgrammaticLogin() print "Connected to spreadsheet" except Exception as e : print "Error connecting to spreadsheet !!! ERROR : ", e dict = {} dict['date'] = time.strftime('%m/%d/%Y') dict['time'] = time.strftime('%H:%M:%S') print dict try : entry = spr_client.InsertRow(dict, spreadsheet_key, worksheet_id) print "Data entered successfully" except Exception as e : print "Could not fill the spreadsheet !!! ERROR : ", e cElementTree.ParseError: mismatched tag: line 1254, column 4个实例交换过来的。然而,这种解释很有意思。

您可以在成功落后的世界中进行编程,同时保持错误。正如软件包文档所示,在处理堆栈的异常处理程序时,这会派上用场。