有没有办法在haskell中解析类型同义词?

时间:2013-08-05 19:05:53

标签: haskell types

当您使用type创建类型同义词时,ghc / ghci将在显式使用时使用它而不是原始类型,但绝不会尝试从推断类型向后工作到匹配的同义词。获取类型的最“抽象”同义词对于学习复杂的应用程序和库非常方便,这些应用程序和库定义了monad堆栈的同义词以及可能的同义词的同义词。

有人写过这样的代码吗?我想它会回溯并且它也会产生一些假的候选者(例如,如果两个类型是String的别名,那么每当必须解析String时它们都将成为候选者),但它在某些情况下可能是有用的。

2 个答案:

答案 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在他的回答中所指出的那样,可能有多种方法可以取消替换类型别名,因此输出实际上可能会产生误导。