Haskell中的EAFP

Haskell中的EAFP,haskell,exception-handling,maybe,Haskell,Exception Handling,Maybe,我对可能和任何一种类型,以及它们和EAFP(更容易请求原谅以获得许可)的假设关系都有疑问。我曾经使用过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 在Haske

我对可能和任何一种类型,以及它们和EAFP(更容易请求原谅以获得许可)的假设关系都有疑问。我曾经使用过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。

    Haskell风格与
    Maybe
    中的任何一个
    都会迫使您在某个时候检查错误,但不必马上检查。如果您现在不想处理这个错误,您可以在计算的其余部分传播它

    以假设的安全除以0为例,您可以在更广泛的计算中使用它,而无需显式检查:

    do result <- func a b
       let x = result * 10
       return x
    

    do result我从未见过正式描述的“EAFP”或“LBYL”范式,所以我不知道如何回答Haskell是否“正式”支持它们。Haskell确实支持异常。我个人认为“EAFP”是一种反模式。您的意思是,使用
    error
    函数?code>error是一个例子,是的。我认为您在这里征求意见-问题是,如果
    y=0
    ,您的预期行为是什么?因为这两个版本的行为非常不同——Python也是如此(我想——我真的不知道任何Python)@CarlosAlonsoGómez——你应该有一本通读的电子书,这是最近发布的。它以
    Maybe
    类型作为一个反复出现的示例来解释Haskell的一些核心概念,包括如何传播失败(没有价值)并仅在程序的“边界”处处理失败。这是一本好书。