我有一个关于Maybe和Either类型的疑问,以及它们与EAFP(易于请求宽恕而不是许可)的假设关系。我曾经使用Python并习惯于在异常世界中使用EAFP范例。
经典例子:除零操作。
在 Haskell 中,第一个函数应该是:
而且,使用Maybe:
在Python版本中,您运行
我的问题是:
经典例子:除零操作。
def func(x,y):
if not y:
print "ERROR."
else: return (x/y)
并且Python的风格:
def func(x,y):
try:
return (x/y)
except: return None
在 Haskell 中,第一个函数应该是:
func :: (Eq a, Fractional a) => a -> a -> a
func x y = if y==0 then error "ERROR." else x/y
而且,使用Maybe:
func :: (Eq a, Fractional a) => a -> a -> Maybe a
func x y = if y==0 then Nothing else Just (x/y)
在Python版本中,您运行
func
而不检查y
。在Haskell中,情况相反:y
已经被检查。我的问题是:
1. 正式来说,Haskell是否支持EAFP范例或“更偏爱”LBYL,即使它承认EAFP的半古怪的近似?
PD:我称之为“半古怪”,因为即使它在直觉上可读,但对我来说,它看起来像是违反了EAFP。
y = 0
,你期望的行为是什么?因为这两个版本的行为非常不同-对于 Python 也是如此(我猜的-我实际上不太了解 Python)。 - Random DevMaybe
类型作为一个重要例子来解释Haskell中一些核心概念,包括如何在程序的“边界”处传播和处理失败(值的缺失)。这是一本很好的读物。 - jub0bs