gpt4 book ai didi

haskell - Haskell 中的 EAFP

转载 作者:行者123 更新时间:2023-12-03 22:16:00 24 4
gpt4 key购买 nike

我对“Maybe”和“Either”类型以及它们与 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 风格与 MaybeEither强制您在某个时候检查错误,但不必立即检查。如果您现在不想处理错误,您可以将它传播到您的其余计算中。

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

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

    在这里,您不必匹配 Maybe返回者 func : 你只要把它解压到 result变量使用 do-notation,它会自动在整个过程中传播失败。结果是你不需要立即处理潜在的错误,但计算的最终结果被包裹在 Maybe 中。本身。

    这意味着您可以轻松地组合(组合)可能导致错误的函数,而无需在每一步检查错误。

    从某种意义上说,这为您提供了两全其美的优势。你仍然只需要在一个地方检查错误,最后,但你是 显式 关于它。您必须使用诸如 do-notation 之类的东西来处理实际的传播,并且您不能意外地忽略最终错误:如果您不想处理它,则必须明确地将其转换为运行时错误。

    显式不是比隐式更好吗?

    现在,Haskell 也有一个处理运行时错误的异常系统,你根本不需要检查这些错误。这偶尔有用,但不是太频繁。在 Haskell 中,我们只将它用于我们不希望捕捉到的错误——真正的异常情况。经验法则是,运行时异常表示程序中的错误,而不正确的输入或仅仅是不常见的情况应该用 Maybe 表示。或 Either .

    关于haskell - Haskell 中的 EAFP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29682511/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com