【问题标题】:How to type the simply typed lambda calculus term (S K K)如何键入简单类型的 lambda 演算项 (S K K)
【发布时间】:2020-08-07 00:53:45
【问题描述】:

我正在尝试实现一个简单类型的 lambda 演算类型检查器。在运行健全性测试时,我尝试输入 (SK K) 并且我的类型检查器抛出此错误:

TypeMismatch {firstType = t -> t, secondType = t -> t -> t}

有问题的词显然是 (S K K)

(\x:t -> t -> t.\y:t -> t.\z:t.x z (y z)) (\x:t.\y:t.x) (\\x:t.\y:t.x)

我认为问题出在缺乏多态性,因为当我输入检查这个 haskell 代码时它工作正常:

k x y = x
s x y z = x z (y z)
test = s k k -- type checks

但如果我专门研究类型:

k :: () -> () -> ()
k x y = x
s :: (() -> () -> ()) -> (() -> ()) -> () -> ()
s x y z = x z (y z)
test = s k k -- doesn't type check 

仅供参考,我的类型系统很简单:

data Type = T | TArr Type Type

full source

【问题讨论】:

  • 我想知道 S (SKK)(SKK) 的类型可能是什么。

标签: haskell lambda functional-programming k-combinator s-combinator


【解决方案1】:

我将从a previous answer of mine 那里窃取想法,以展示如何向 ghci 提出您的问题。但首先我要稍微重新表述你的问题。

在 Haskell 中,我们有

s :: (a -> b -> c) -> (a -> b) -> (a -> c)
k :: a -> b -> a

我们想问的问题是“在类型检查s k k 之后这些类型是什么样的?”。更重要的是,如果我们用不同的统一变量重写它们,

s :: (a -> b -> c) -> (a -> b) -> (a -> c)
k :: d -> e -> d
k :: f -> g -> f
s k k :: h

那么问题就变成了一个统一的问题:我们试图将s 的类型与它正在使用的类型统一起来——即(d -> e -> d) -> (f -> g -> f) -> h。现在我们手头有一个统一问题,我们可以按照我的另一个答案中显示的格式提问:

> :{
| :t undefined
| ::   ((a -> b -> c) -> (a -> b) -> (a -> c))
|    ~ ((d -> e -> d) -> (f -> g -> f) -> h)
| => (a, b, c, d, e, f, g, h)
| :}
undefined
::   ((a -> b -> c) -> (a -> b) -> (a -> c))
   ~ ((d -> e -> d) -> (f -> g -> f) -> h)
=> (a, b, c, d, e, f, g, h)
  :: (f, g -> f, f, f, g -> f, f, g, f -> f)

现在我们可以看到为什么您的版本不起作用了:在您的版本中,您已将所有多态变量实例化为基本类型 T;但由于b ~ g -> fe ~ g -> fh ~ f -> f 显然是箭头类型,那肯定行不通!但是,如果我们尊重上述替换,fg 的任何选择都将起作用;特别是如果我们选择f ~ Tg ~ T,那么我们有

s :: (T -> (T -> T) -> T) -> (T -> (T -> T)) -> (T -> T)
k1 :: T -> (T -> T) -> T
k2 :: T -> T -> T
s k1 k2 :: T -> T

【讨论】:

  • 这很好用。以后我一定会用这个方法谢谢!
猜你喜欢
  • 2017-06-24
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2019-02-02
相关资源
最近更新 更多