首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为列表创建TypeClass实例

为列表创建TypeClass实例
EN

Stack Overflow用户
提问于 2014-10-09 13:05:28
回答 1查看 262关注 0票数 2

在回答我的问题之前,让我陈述一下我的理解(也许是不正确的),即列表[]是一种更友好的类型:

代码语言:javascript
复制
ghci> :kind []
[] :: * -> *

我可能弄错了,但是,[]需要一种类型,因为它是List of some type 'T'

现在来回答我的问题。

代码语言:javascript
复制
class Foo a where
  bar :: String -> a

然后,我尝试创建一个Foo [String]。我的理解是,a in Foo a[String]。因此,我希望bar返回一个[String]

代码语言:javascript
复制
instance Foo [String] where
    bar []    = []
    bar (x:_) = [x]

但是,我得到了以下编译时错误:

代码语言:javascript
复制
ghci> :l TypeClassExample.hs 
[1 of 1] Compiling Main             ( TypeClassExample.hs, interpreted )

TypeClassExample.hs:5:10:
    Illegal instance declaration for `Foo [String]'
      (All instance types must be of the form (T a1 ... an)
       where a1 ... an are *distinct type variables*,
       and each type variable appears at most once in the instance head.
       Use -XFlexibleInstances if you want to disable this.)
    In the instance declaration for `Foo [String]'
Failed, modules loaded: none.

我犹豫不决地添加这个编译时标志而不理解它。

在这个简单的代码中,它的意义是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-09 13:52:48

Haskell语言定义的限制性很强,只允许列表实例的形式。

代码语言:javascript
复制
instance ... => Foo [a] where

在头部,a恰好是一个类型变量a,不允许使用[Int][String]

但是,您可以要求GHC忽略此限制。只需在文件开头添加以下内容:

代码语言:javascript
复制
{-# LANGUAGE FlexibleInstances #-}

许多,许多现代Haskell程序都利用了这一点。可以说,在下一个Haskell定义修订版中,这个GHC特性应该被集成。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26279195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档