当您使用type
创建类型同义词时,ghc / ghci将在显式使用时使用它而不是原始类型,但绝不会尝试从推断类型向后工作到匹配的同义词。获取类型的最“抽象”同义词对于学习复杂的应用程序和库非常方便,这些应用程序和库定义了monad堆栈的同义词以及可能的同义词的同义词。
有人写过这样的代码吗?我想它会回溯并且它也会产生一些假的候选者(例如,如果两个类型是String的别名,那么每当必须解析String时它们都将成为候选者),但它在某些情况下可能是有用的。
答案 0 :(得分:1)
不是答案,而是一个问题。类型同义词通常用于在“高级代码”中很好地命名类型,但是只要将这些类型传递给较低级别/辅助代码(根据更具体的类型定义),系统应该如何跟踪同义词适用?请考虑以下事项:
type Title = String
type Name = String
capitalise :: String -> String
my_title = "Mayor" :: Title
shouted_title = capitalise my_title :: ???
类型检查器如何知道进入heleper函数capitalise
的字符串在概念上与capitalise
中出现的字符串相同?在存在多个类型别名的情况下,类型检查器应该如何选择使用哪个?
答案 1 :(得分:0)
Frege编译器,IDE和REPL尝试为类型应用程序((>)的应用程序除外)在要求它们显示“漂亮”类型时执行此操作,并且它在大多数情况下都有效。以下是online session代码段示例:
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在他的回答中所指出的那样,可能有多种方法可以取消替换类型别名,因此输出实际上可能会产生误导。