【发布时间】:2012-02-25 03:12:08
【问题描述】:
我对翻转的“部分”应用可能会做什么有点困惑。
由于flip函数的类型是:
flip :: (a -> b -> c) -> b -> a -> c
不用括号我们可以写成:
flip :: a -> b -> c -> b -> a -> c
我如何才能将其部分应用于仅第一个参数a?获取具有以下类型的函数:
flipa :: b -> c -> b -> a -> c
还是没有意义?
例如,如果我有类似的东西:
let foo a b = (Just a, b)
:t foo
> foo:: a -> t -> (Maybe a, t)
部分应用它是有意义的:
let a = foo 1
:t a
a :: t -> (Maybe Integer, t)
【问题讨论】:
-
(->)是右关联的,而不是左关联的:您描述的flipa是一个完全不同的函数(AFAIK 类型规定它必须是flipa _ x _ _ = x)。 -
为什么这两个不等价的另一种观点:让我们以
f :: (a → a) → a和g :: a → a → a为例。通过 Curry-Howard 同构,g表示定理a ⇒ a ⇒ a,即如果a为真,则a暗示a(这是真的;它可以从a ⇒ (b ⇒ a)推导出来(直觉逻辑公理) )。另一方面,(a ⇒ a) ⇒ a没有告诉我们任何关于a的信息(如果a暗示a那么a;但正如你所看到的,a也可能是假的,a ⇒ a仍然成立)。确实,如果你有f :: (a → a) → a,你可以证明false为真:boom :: False; boom = f id(其中False为空数据类型)
标签: haskell