将(+)
运算符转换为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
答案 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 F或Hindley-Milner type system的用途。这允许类型注释,如果一切都匹配,您可以使用类型推断算法检查编译时间。它通过强制类型替换缩小了β减少的规则。
可以找到类型推断算法的更完整的介绍和示例代码here。