您为什么不能(完全)应用带有使用其他类型同义词的参数的类型同义词?

巴库留

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

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抱怨我没有传递参数?

类型同义词不应该完全透明并且无法与其他类型区别吗?

有什么方法可以实现预期的行为?

巴库留

根据Haskell报告类型,同义词不能部分应用:

类型T同义词声明引入的类型构造函数符号不能部分应用;如果T没有全部参数,则使用它是一个静态错误

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

MyType Test'

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

然而,这可能实现使用GHC这种行为LiberalTypeSynonyms的延伸。此扩展将类型同义词视为宏,将对其进行扩展而无需进行任何检查,然后类型检查器将查看是否部分应用了类型同义词。

在类型同义词扩展之前,仍然要进行种类推断

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

Test' Int

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

允许部分应用类型同义词将使类型推断变得不确定,因此无法轻松地在该方向上扩展类型系统。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用类型同义词定义实例

来自分类Dev

为什么关联的类型同义词不暗示约束

来自分类Dev

我的Haskell类型同义词有什么问题?

来自分类Dev

找出类型同义词的类型

来自分类Dev

类型同义词导致类型错误

来自分类Dev

类型族作为类型同义词的参数

来自分类Dev

Haskell的“其他”是“ _”的同义词?

来自分类Dev

在haskell中查找类型同义词

来自分类Dev

让Haskell区分类型同义词

来自分类Dev

在类型声明映射中使用类型同义词

来自分类Dev

使用模板Haskell获取关联的类型同义词

来自分类Dev

如何在实例声明中使用类型同义词?

来自分类Dev

使用特定的类定义类型同义词

来自分类Dev

定义类型同义词(GHC)的类型同义词时出现奇怪的错误

来自分类Dev

基于lambda / church布尔值的类型同义词

来自分类Java

Java泛型和类型同义词

来自分类Dev

一个类中的多个类型同义词

来自分类Dev

如何为类型类名称创建同义词?

来自分类Dev

Purescript 将类视为循环类型同义词

来自分类Dev

为什么搜索会忽略同义词?

来自分类Dev

为什么C ++需要运算符同义词?

来自分类Dev

序列可以有同义词吗?

来自分类Dev

使用同义词时的Liquibase问题

来自分类Java

无法使用Spring更改同义词

来自分类Dev

无法制作具有类型同义词的对象:类型

来自分类Dev

ElasticSearch多字同义词

来自分类Dev

同义词Matlab函数

来自分类Dev

查询同义词 ElasticSearch

来自分类Dev

Haskell:实例中的非法类型同义词系列应用程序