Control.Exception.evaluate区别对待等效函数生成的重击

ram*_*ion 8 haskell

这是两个等效的部分函数:

  • \True -> \() -> ()
  • \True () -> ()

适用于或都会False引发PatternMatchFail异常。

当我用来Control.Exception.evaluate将前者制作的重击强制到WHNF时,它会强制执行以下PatternMatchFail异常:

ghci> _ <- evaluate $ (\True -> \() -> ()) False
*** Exception: <interactive>:10:18-35: Non-exhaustive patterns in lambda
Run Code Online (Sandbox Code Playgroud)

当我使用后一种形式时,它不会:

ghci> _ <- evaluate $ (\True () -> ()) False
Run Code Online (Sandbox Code Playgroud)

为什么不?

(关于GHC-8.0.1)

Li-*_*Xia 7

从Haskell 2010报告中:

以下身份成立:

\ p1 … pn -> e    =   \ x1 … xn -> case (x1, …, xn) of (p1, …, pn) -> e
Run Code Online (Sandbox Code Playgroud)

https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-260003.3

因此,对\True () -> e降低了负担\x y -> case (x, y) of (True, ()) -> e,将其部分应用之后即False\y -> case (False, y) of ...一个函数抽象,因此这并不是底层。

相反,\True -> f(where f = \() -> e)减至\x -> case x of True -> ...,并且有例外。