数据族实例非法绑定到内置语法:()

时间:2015-07-14 12:56:28

标签: haskell compiler-errors type-families

我正在尝试定义一个data type family,其中一个参数会导致空元组()的类型,但它不会编译。这是一个最小的工作示例:

{-# LANGUAGE TypeFamilies #-}

data family F a
data instance F Int = ()

抛出的编译器错误显示“内置语法的非法绑定:()”。为什么我会收到此错误,即使我不是要更改()的定义,而是将其设置为某些计算的输出(类型系列的评估)?

对于它的价值,当()改为Bool时编译的程序。

1 个答案:

答案 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