这种类型的术语

时间:2015-10-14 23:25:07

标签: haskell

我想用

构造术语

((((t1 -> t2) -> t1) -> t1) -> t2) -> t1

但我不知道如何开始。我知道如果我有类似的话,我必须做些什么 (t1->t2)->t1->t2。 但在这种情况下,我只有一个论点!怎么解决这个问题?

2 个答案:

答案 0 :(得分:3)

左下角explained关于你需要做什么的概述,但是作为ØrjanJohansennoted,他们错过了最后的一个关键想法。我想通过添加来自leftaroundabout开发的类型签名来扩展Ørjan的评论。

\(a :: (((t1 -> t2) -> t1) -> t1) -> t2) -> a $
  \(b :: (t1 -> t2) -> t1) -> b $
    \(c :: t1) -> a (\ _ -> c)

这里的神奇之处在于,一旦我们需要生成t2,我们就可以使用t1a提供一个参数来获取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

如果t1t2实际上是无约束的类型变量,那么这是不可能的,但我认为您发布的签名有点简化。也许很明显如何定义最里面的功能,其余的也很容易。