Types 从类型方案构造表达式
因此,我被要求为以下类型找到一个表达式:Types 从类型方案构造表达式,types,scheme,expression,Types,Scheme,Expression,因此,我被要求为以下类型找到一个表达式: (int -> ((int -> (bool -> int)) -> (bool -> int))) 因此,我构建了以下代码来生成(bool->int),但这是困扰我的组合: (%which (T) (%typing '(lambda (f) (lambda (x) (succ (f (not x)))))
(int -> ((int -> (bool -> int)) -> (bool -> int)))
因此,我构建了以下代码来生成(bool->int),但这是困扰我的组合:
(%which (T)
(%typing '(lambda (f)
(lambda (x)
(succ (f (not x)))))
T))
谁能告诉我一些好的规则或方法吗?:) 有几个工具可以从类型派生实现(通过Curry/Howard对应)。一个例子是。下面是一个示例,展示了如何从类型生成术语
您可能会了解更多有关Curry Howard的信息,并将类型转换为代码工具移植到Scheme?关于您问题的具体内容(而不是一般技术),我可以这样做:
(int->((int->(bool->int))->(bool->int))
可以简化为(A->((A->B)->B))
其中A=int
和B=(bool->int)
。此简化版本易于构建:
(lambda (a)
(lambda (f)
(f a)))
很容易理解为什么这样做:a
具有类型a
,f
具有类型(a->B)
,因此调用(fa)
将导致B
。为了给这些变量添加具体类型,a
有typeint
,f
有type(int->(bool->int))
,结果当然是(bool->int)
因此,现在需要找到一个合适的函数,该函数的类型为(int->(bool->int))
以插入f
参数。这是一个非常简单的例子:
(lambda (n)
(lambda (negate?)
((if negate? - +) n)))
下面是如何使用这些函数:
> (define (foo a)
(lambda (f)
(f a)))
> (define (bar n)
(lambda (negate?)
((if negate? - +) n)))
> (define baz ((foo 42) bar))
> (baz #t)
-42
> (baz #f)
42
我个人认为,当您从类型中删除多余的括号时(就像非schemer编写的那样),它会变得更加明显: 因此,您应该编写一个函数,该函数有三个参数,并返回一个
int
。也就是说,解决方案必须以以下形式表达:
lambda n. lambda f. lambda b. ____
但是你怎么填补这个洞呢?好的,看看你从参数中得到了什么类型,很容易看出你可以通过把f
应用到n
和b
,把它们插在一起,得到一个int
。因此:
lambda n. lambda f. lambda b. f n b
这是一个解决方案。但是仔细观察这个术语,我们会发现最里面的lambda实际上是可以减少的,给出了一个更简单的术语:
lambda n. lambda f. f n
但事实上,这个问题有点复杂,因为返回一个int总是很简单的。因此,最简单的解决方案可能是:
lambda n. lambda f. lambda b. 0
获得解决方案的一般方案通常是通过对类型结构的简单归纳:如果需要函数,那么写下lambda并递归地处理主体。如果您需要一个元组,那么写下一个元组并递归地处理它的组件。如果你需要一个基本类型,你可以选择一个常量。如果您需要一些您没有的东西(通常在多态情况下),请在范围中查找一些函数参数,这些参数将为您提供这样的东西。如果该参数本身是函数,请尝试递归构造合适的参数。这就是我搜索的解决方案: (lambda(i) (λ(f) (b) (成功((f(成功i))(不是b()())())) 可通过以下方式确认: (%其中(T) (%类型 "(lambda(i) (λ(f) (b) (成功((f(成功i))(不是b()())())) T) )
Succ确保它是一个整数而不是-->bool。Hmm,这个问题是关于schelog和简单类型的。。。您的答案提供的是常规方案代码。我以我用(%which(%typing))结构描述的形式搜索知识。这将是一个很好的时间来编辑您的问题,包括单词和标记,如schelog和简单类型。我们不是读心术的人!我不能创建新标签,因为我是新的。。。因此,添加schelog和简单类型不是一个选项。我对大学的课堂讲稿有类似的解释,但它们似乎不清楚,没有代码作为示例。如果我输入lambda n lambda f和lambda b,后跟一个0,我得到(intint)-我想要(int-->int)-我可能需要按照您的建议添加一个额外的lambda,但同时要避免()@Fedtekansler,我不确定是否遵循。这对是从哪里来的?你输入的确切术语是什么?
lambda n. lambda f. lambda b. 0