非法实例声明
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
,因此您不需要保留两个编译指示。
我刚刚用 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
,因此您不需要保留两个编译指示。