如果我将此功能应用于一个空列表,哪种类型的功能将具有id功能? id函数是否有一些默认类型,或者取决于列表的默认类型?
id []
答案 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的一节还介绍了定义类型类的默认值。