非法实例声明

Vig*_*igo 2 haskell class instance

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

class Symbol a where
  nameSym :: a -> String
Run Code Online (Sandbox Code Playgroud)

和这些实例:

instance Symbol Double where
  nameSym db = show db 

instance Symbol String where
  nameSym str = str
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

你知道这是什么问题吗?

Eri*_*lun 5

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

{-# LANGUAGE TypeSynonymInstances #-}
Run Code Online (Sandbox Code Playgroud)

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

{-# LANGUAGE FlexibleInstances #-}
Run Code Online (Sandbox Code Playgroud)

- 这也使TypeSynonymInstances你不需要保留两个pragma.

  • Haskell 98和Haskell 2010确实允许`[a]`的实例.只是'a`实际上必须是一个类型变量. (2认同)