所以Maybe
数据类型定义如下:
data Maybe a = Just a | Nothing
您认为概念上与Maybe
相反的数据类型是什么:
data <Type> = Okay | Error String
即,一种声明计算成功的类型或者保存计算产生的一些错误。
答案 0 :(得分:7)
我驳斥了这种类型与Maybe
“相反”的意义上的前提。我也不同意Either
通常应被理解为错误信号类型 - 由于其monad实例的工作方式,这是一种非常自然的使用方式。
Maybe
和Either
都对错误/失败一无所知 - 他们只是和类型抽象概念的实现(在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
个实例交换过来的。然而,这种解释很有意思。
您可以在成功落后的世界中进行编程,同时保持错误。正如软件包文档所示,在处理堆栈的异常处理程序时,这会派上用场。