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

Dyl*_*nSp 1 haskell operator-overloading

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

{-# LANGUAGE NoImplicitPrelude #-}

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

(:) :: a -> List a -> List a
(:) = Cons
Run Code Online (Sandbox Code Playgroud)

我收到以下错误stack runghc:

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

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

重新定义是不可能的:?这就是我收到这个错误的原因吗?

Dan*_*ner 10

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

data Foo = Foo : Foo
Run Code Online (Sandbox Code Playgroud)

给你一个错误,说:

error: Illegal binding of built-in syntax: :
Run Code Online (Sandbox Code Playgroud)

据推测,通过一些额外的工程努力,未来的GHC可以支持重新定义:并启用一些合适的扩展,但目前还不可能.