【问题标题】:Data family instance binding illegally to built in syntax: ()数据族实例非法绑定到内置语法:()
【发布时间】:2015-07-14 12:56:27
【问题描述】:
我正在尝试定义一个data type family,其中一个参数导致空元组() 的类型,但它无法编译。这是一个最小的工作示例:
{-# LANGUAGE TypeFamilies #-}
data family F a
data instance F Int = ()
抛出的编译器错误显示“内置语法的非法绑定:()”。为什么我会收到此错误,即使我没有尝试更改 () 的定义,而是将其设置为某些计算的输出(类型族的评估)?
不管怎样,() 时编译的程序改为Bool。
【问题讨论】:
标签:
haskell
compiler-errors
type-families
【解决方案1】:
对于数据系列,您应该在等式的右侧提供 ADT 或 GADT 定义。 () 不是构造函数的有效定义。 data instance F Int = Bool 声明了一个名为 Bool 的构造函数,它可以工作,但与 Bool 类型没有任何关系。只是 Bool 可用作构造函数名称。
您尝试做的事情可以用类型族来实现:
type family F a
type instance F Int = ()
-- or in closed form
type family F a where
F Int = ()
或者您可以为数据实例提供一个右手边,相当于():
data instance F Int = FUnit