我想用
构造术语 ((((t1 -> t2) -> t1) -> t1) -> t2) -> t1
但我不知道如何开始。我知道如果我有类似的话,我必须做些什么
(t1->t2)->t1->t2
。
但在这种情况下,我只有一个论点!怎么解决这个问题?
答案 0 :(得分:3)
左下角explained关于你需要做什么的概述,但是作为ØrjanJohansennoted,他们错过了最后的一个关键想法。我想通过添加来自leftaroundabout开发的类型签名来扩展Ørjan的评论。
\(a :: (((t1 -> t2) -> t1) -> t1) -> t2) -> a $
\(b :: (t1 -> t2) -> t1) -> b $
\(c :: t1) -> a (\ _ -> c)
这里的神奇之处在于,一旦我们需要生成t2
,我们就可以使用t1
为a
提供一个参数来获取t2
。
答案 1 :(得分:2)
请注意,在链((... -> x) -> y) -> z
中,您可以在协变和逆变之间来回切换。这意味着什么:您需要定义... -> z
函数。您在此函数中使用的内容是... -> y
。要实际执行该功能,您必须再次提供... -> x
。
适用于您的任务:
((((t1 -> t2) -> t1) -> t1) -> t2) -> t2
。(((t1 -> t2) -> t1) -> t1) -> t2
。((t1 -> t2) -> t1) -> t1
(t1 -> t2) -> t1
。t1 -> t2
。如果t1
和t2
实际上是无约束的类型变量,那么这是不可能的,但我认为您发布的签名有点简化。也许很明显如何定义最里面的功能,其余的也很容易。