当您创建一个类型同义词时type
,ghc/ghci 将在显式使用它时使用它而不是原始类型,但永远不会尝试从推断类型向后工作到匹配的同义词。为一种类型获取最“抽象”的同义词对于学习复杂的应用程序和库非常方便,它们定义了 monad 堆栈的同义词以及可能的同义词的同义词。
有没有人写过这样一段代码?我想它会是回溯,并且还会产生一些虚假的候选者(例如,如果两种类型是 String 的别名,那么每当必须解析 String 时它们都将成为候选者),但它在某些情况下可能很有用。
不是一个答案,而是一个问题。类型同义词通常用于在“高级代码”中很好地命名类型,但是一旦您将这些类型传递到较低级别/帮助代码(根据更具体的类型定义),系统应该如何跟踪哪个同义词适用?考虑以下:
type Title = String
type Name = String
capitalise :: String -> String
my_title = "Mayor" :: Title
shouted_title = capitalise my_title :: ???
类型检查器如何知道进入 heleper 函数的 String 在capitalise
概念上与来自 的 String 类型相同capitalise
?在存在多个类型别名的情况下,类型检查器应该如何选择使用哪个?
Frege 编译器、IDE 和 REPL 在要求显示“好”类型时尝试对类型应用程序(除了 (->) 的应用程序)执行此操作,并且在大多数情况下确实有效。这是一个示例在线会话片段:
frege> type Flubber = (Int, Double)
frege> x = (42, 3.0)
frege> :t x
Flubber
frege> y = [x,x,x,x]
frege> :t y
[Flubber]
因此,原则上,它也应该在 Haskell 中工作(可能以相对于 Haskell 2010 的类型系统中的某些扩展为模)。
但是请记住,正如@Thomas 在他的回答中指出的那样,可能有多种方法可以取消替换类型别名,因此输出实际上可能具有误导性。