为什么我不能在Haskell中重新定义:运算符?

时间:2018-01-09 05:04:21

标签: haskell operator-overloading

我正在尝试重新实现Haskell中列表数据类型的某些功能以用于学习目的。当我尝试使用以下代码重新定义:时:

{-# LANGUAGE NoImplicitPrelude #-}

data List a = Nil
            | Cons a (List a)

(:) :: a -> List a -> List a
(:) = Cons

我使用stack runghc收到以下错误:

  

无效的类型签名:(:) :: ...

     

应该是< variable>的形式::< type>

重新定义:是否无法实现?这就是我收到这个错误的原因吗?

1 个答案:

答案 0 :(得分:10)

重新定义:是不可能的,但这不是您收到错误的原因。您收到该错误是因为:被视为“大写标点符号” - 也就是说,以:开头的任何名称都必须是(中缀)值构造函数。然而,即使启用了NoImplicitPreludeRebindableSyntax,您也会发现,例如

data Foo = Foo : Foo

给你一个错误,说:

error: Illegal binding of built-in syntax: :

大概需要一些额外的工程努力,未来的GHC可以支持重新定义:并启用一些合适的扩展,但目前这是不可能的。

相关问题