我刚用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'
你知道这是什么问题吗?
答案 0 :(得分:5)
问题是String
是[Char]
的类型别名,而Haskell 98规范不允许在类型别名上定义实例。这可以通过在文件的标题中添加它来解决:
{-# LANGUAGE TypeSynonymInstances #-}
但是,仍然不允许编译程序,因为Haskell 98也不允许[SomeConcreteType]
的实例(只允许[a]
的实例 - 感谢Ørjan指出那个在没有使用语言编译指示的情况下,在Haskell 98中存在一种解决方法,解决这个问题的最简单方法(它也是完全安全和惯用的)是添加以下编译指示:
{-# LANGUAGE FlexibleInstances #-}
- 这也启用TypeSynonymInstances
,因此您无需保留两个编译指示。
答案 1 :(得分:3)
您可以使用编译指示:
{-# LANGUAGE FlexibleInstances #-}
在源文件的头部。