我正在尝试定义一个data type family,其中一个参数会导致空元组()
的类型,但它不会编译。这是一个最小的工作示例:
{-# LANGUAGE TypeFamilies #-}
data family F a
data instance F Int = ()
抛出的编译器错误显示“内置语法的非法绑定:()
”。为什么我会收到此错误,即使我不是要更改()
的定义,而是将其设置为某些计算的输出(类型系列的评估)?
对于它的价值,当()
改为Bool
时编译的程序。
答案 0 :(得分:7)
对于数据族,您应该在等式的右侧提供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