非法实例声明

Illegal instance declaration

我刚刚用 Haskell 创建了一个 class,但我的一个实例有问题。我创建了这个 class:

class Symbol a where
  nameSym :: a -> String

以及这些实例:

instance Symbol Double where
  nameSym db = show db 

instance Symbol String where
  nameSym str = str

但是在编译时,我收到以下错误消息:

Illegal instance declaration for `Symbol String'
  (All instance types must be of the form (T t1 ... tn)
   where T is not a synonym.
In the instance declaration for `Symbol String'

你知道问题出在哪里吗?

你可以使用 pragma :

{-# LANGUAGE FlexibleInstances #-}

在源文件的开头。

问题是 String[Char] 的类型别名,而 Haskell 98 规范不允许在类型别名上定义实例。这可以通过在文件的 header 中添加以下内容来解决:

{-# LANGUAGE TypeSynonymInstances #-}

但是,这仍然不允许您编译程序,因为 Haskell 98 也不允许 [SomeConcreteType] 的实例(只允许 [a] 的实例 — 谢谢Ørjan 指出了这一点),虽然在 Haskell 98 中存在不使用语言编译指示的解决方法,但解决这个问题的最简单方法(也是完全安全和惯用的)是添加以下编译指示:

{-# LANGUAGE FlexibleInstances #-}

— 这也会启用 TypeSynonymInstances,因此您不需要保留两个编译指示。