非法实例声明

时间:2015-10-26 22:54:37

标签: class haskell instance

我刚用Haskell创建了一个类,但是我的一个实例遇到了问题。我创建了这个类:

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'

你知道这是什么问题吗?

2 个答案:

答案 0 :(得分:5)

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

{-# LANGUAGE TypeSynonymInstances #-}

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

{-# LANGUAGE FlexibleInstances #-}

- 这也启用TypeSynonymInstances,因此您无需保留两个编译指示。

答案 1 :(得分:3)

您可以使用编译指示:

{-# LANGUAGE FlexibleInstances #-}

在源文件的头部。