【问题标题】:Why can't you (totally) apply a type synonym that has arguments using an other type synonym?为什么您不能(完全)应用具有使用其他类型同义词的参数的类型同义词?
【发布时间】:2014-07-22 16:20:14
【问题描述】:

我们可以用参数定义类型同义词,这在与实际类型一起使用时效果很好:

type MyType t = t String String

data Test a b = Test a b

f :: MyType Test
f = undefined

main = undefined

编译不会出错:

$ghc --make test.hs                                           
[1 of 1] Compiling Main             ( test.hs, test.o )                                          
Linking test ...   

但是,当 Test 是类型同义词时,这不起作用:

type MyType t = t String String

data Test a b = Test a b

type Test' a b = Test a b

f :: MyType Test'
f = undefined

main = undefined

这给出了以下错误:

$ghc --make test.hs
[1 of 1] Compiling Main             ( test.hs, test.o )

test.hs:7:6:
    Type synonym Test' should have 2 arguments, but has been given none
    In the type signature for `f': f :: MyType (Test')

让我感到困惑的是Test'被应用于两个参数,那么为什么 GHC 抱怨我没有通过参数?

类型同义词不应该是完全透明的,无法与其他类型区分开来吗?

有没有办法实现预期的行为?

【问题讨论】:

  • @dbaupp 我的问题与 GHC 扩展或实例声明无关。答案可能相同的事实暗示问题是重复的。该问题的答案也没有解决我的问题的第二部分(如何允许这种代码),我刚刚发现 is 可能使用LiberalTypeSynonyms (即 与这些答案相比)。
  • @Cactus 这个答案和问题是关于 partial 类型的同义词应用程序。我的问题是关于使用其他类型同义词的 total 类型同义词应用程序(MyType Test' 在扩展后导致Test'total 应用程序)。它们是完全不同的东西,实际上答案是不同的,因为您可以使用非常简单的扩展来解决后者,而前者会使类型系统无法确定。

标签: haskell types


【解决方案1】:

根据Haskell report类型的同义词不能部分应用:

类型同义词声明引入的类型构造函数符号T 不能部分应用;不使用 T 是静态错误 完整数量的参数。

特别是在扩展类型同义词之前检查,这意味着在表达式中:

MyType Test'

检查是在扩展 MyType 之前执行的,因此会部分应用 Test' 结果。

但是,可以使用 GHC LiberalTypeSynonyms 扩展来实现该行为。此扩展将类型同义词视为宏,它们在没有任何检查的情况下进行扩展,之后类型检查器将查看是否部分应用了类型同义词。

种类推断仍然在类型同义词扩展之前完成。

请注意,即使在这种情况下,也不能部分应用类型同义词,例如:

Test' Int

仍然是一个错误。但是,您现在可以使用类型同义词完全应用其他类型同义词而不会收到错误。

允许部分应用类型同义词会使类型推断变得不可判定,因此不可能轻易地向那个方向扩展类型系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多