beta减少类型

时间:2017-09-20 13:55:40

标签: haskell lambda

(+)运算符转换为lambda演算时,它看起来像:

λx.λy.x + y

然后进行β降低

(λx.λy.x + y) 1 --substitute x through 1
(λy.1 + y)      
(λy.1 + y)    2 --substitute y through 2
1 + 2
3               --is the normal form 

现在,我有一个带有以下类型签名的函数:

f :: (t1 -> t) -> t1 -> t

我的问题是:

  • 我可以将函数f的类型签名转换为lambda 微积分(就像我翻译上面的+运算符)?

  • 我也可以为类型应用beta减少原则(知道类型
    取代)?

使用类型替换,我的意思如下:

*Twinplicative> :t id (+)
id (+) :: Num a => a -> a -> a

我确实将id的第一个参数(称为a)替换为(+)运算符的类型签名,然后它变为Num a => a -> a -> a

1 个答案:

答案 0 :(得分:1)

您可以使用与在lambda演算中使用值相同的方式使用函数。您使用(+)的示例如下所示:

(λf. λx. λy. f x y) (+) 1 2
~> (λx. λy. (+) x y)  1 2
~> (λy. (+) 1 y) 2
~> ((+) 1 2)
~> 1 + 2
~> 3

您可以替换已知类型,但要确保正确性,您必须运行该函数并查看类型是否匹配。

但是,在纯lambda演算中,您无法对类型签名进行编码,这是System FHindley-Milner type system的用途。这允许类型注释,如果一切都匹配,您可以使用类型推断算法检查编译时间。它通过强制类型替换缩小了β减少的规则。

可以找到类型推断算法的更完整的介绍和示例代码here