这是两个等效的部分函数:
\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)
从Haskell 2010报告中:
以下身份成立:
Run Code Online (Sandbox Code Playgroud)\ p1 … pn -> e = \ x1 … xn -> case (x1, …, xn) of (p1, …, pn) -> ehttps://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 -> ...,并且有例外。