我正在尝试重新实现Haskell中列表数据类型的某些功能以用于学习目的。当我尝试使用以下代码重新定义:
时:
{-# LANGUAGE NoImplicitPrelude #-}
data List a = Nil
| Cons a (List a)
(:) :: a -> List a -> List a
(:) = Cons
我使用stack runghc
收到以下错误:
无效的类型签名:(:) :: ...
应该是< variable>的形式::< type>
重新定义:
是否无法实现?这就是我收到这个错误的原因吗?
答案 0 :(得分:10)
重新定义:
是不可能的,但这不是您收到错误的原因。您收到该错误是因为:
被视为“大写标点符号” - 也就是说,以:
开头的任何名称都必须是(中缀)值构造函数。然而,即使启用了NoImplicitPrelude
和RebindableSyntax
,您也会发现,例如
data Foo = Foo : Foo
给你一个错误,说:
error: Illegal binding of built-in syntax: :
大概需要一些额外的工程努力,未来的GHC可以支持重新定义:
并启用一些合适的扩展,但目前这是不可能的。