id函数的默认类型

时间:2019-05-11 17:43:00

标签: haskell

如果我将此功能应用于一个空列表,哪种类型的功能将具有id功能? id函数是否有一些默认类型,或者取决于列表的默认类型?

id []

1 个答案:

答案 0 :(得分:2)

简而言之id []的类型为[a],确切的类型取决于调用者的上下文。

我们可以自己执行类型的推理。我们基本上有两个项目:id[]id的类型为id :: a -> a,而[]只是一个构造函数,所以它的类型为 [] :: [b]

因此我们可以通过以下方式派生类型

  id :: a   -> a
  [] :: [b]
----------------
  a ~ [b]

因此,我们得出结论,a中的id :: a -> a[b]属于同一类型,因此这意味着id []的结果类型为{{ 1}}等于a,因此表示:

[b]

id [] :: [b]导出ghci的类型时,我们得到相同的结果:

id []

当然,在实际程序中,如果使用Prelude> :t id [] id [] :: [t],它将“折叠”为某种类型。该类型取决于{caller” id []的使用。例如,如果我们用以下方式调用它:

id []

由于putStrLn期望使用putStrLn (id [])作为参数,因此这意味着 this 上下文中的String应该是id []String只是String别名。因此,类型系统会导致在这种情况下[Char],因此列表b ~ Char在此上下文中是[]个空列表。

但是如果我们在Char的上下文中使用它,则类型将完全不同,因为我们不能sum (id [])最多sum s,因为我们只能总结Char类型类的成员的所有类型。

万一类型为ramains的歧义,Haskell有一些defaulting rules [Kwang's Haskell blog]。例如,Haskell '10 report的一节还介绍了定义类型类的默认值。