【发布时间】:2015-04-16 17:56:47
【问题描述】:
我对 Maybe 和 Either 类型以及它们与 EAFP(Easier Ask Forgiveness to Permission)的假设关系持怀疑态度。我使用过 Python,并且习惯于在异常世界中使用 EAFP 范式。
经典例子:除以零
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
还有可能:
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 被选中。
我的问题:
- 正式地说,Haskell 是否支持 EAFP 范式或“更喜欢”LBYL,尽管承认一个半奇怪的 EAFP 近似?
PD:我称其为“半奇异”,因为即使它直观易读,它看起来(至少对我而言)就像是 EAFP 漏洞。
【问题讨论】:
-
我从未见过正式描述过“EAFP”或“LBYL”范式,所以我不知道如何回答 Haskell 是否“正式”支持它们。 Haskell 确实支持异常。就个人而言,我认为“EAFP”是一种反模式。
-
你的意思是
error函数? -
error函数就是一个例子,是的。 -
我认为您在这里征求意见-问题是如果
y = 0,您的预期行为是什么?因为这两个版本的行为非常不同 - 与 Python 相同(我猜 - 我真的不知道任何 Python) -
@CarlosAlonsoGómez 您应该阅读一下最近发布的电子书Maybe Haskell。它以
Maybe类型作为一个反复出现的例子来解释Haskell 的一些核心概念,包括如何仅在程序的“边界”处传播和处理失败(缺少值)。这是一本好书。
标签: haskell exception-handling maybe