2014-04-25 3 views
9

Die OverloadedLists Sprache Pragma in GHC 7.8 ist sehr attraktiv, so dass ich beschloss, es zu versuchen:OverloadedLists Erweiterung funktioniert nicht

{-# LANGUAGE OverloadedLists #-} 

import Data.Set (Set)                  
import qualified Data.Set as Set 

mySet :: Set Int 
mySet = [1,2,3] 

Und der Compiler gibt mir:

No instance for (GHC.Exts.IsList (Set Int)) 
     arising from an overloaded list 
    In the expression: [1, 2, 3] 
    In an equation for ‘mySet’: mySet = [1, 2, 3] 

    No instance for (Num (GHC.Exts.Item (Set Int))) 
     arising from the literal ‘1’ 
    In the expression: 1 
    In the expression: [1, 2, 3] 
    In an equation for ‘mySet’: mySet = [1, 2, 3] 
Failed, modules loaded: none. 

Auch das Beispiel aus der Versionshinweise funktionieren nicht:

> ['0' .. '9'] :: Set Char 

<interactive>:5:1: 
    Couldn't match type ‘GHC.Exts.Item (Set Char)’ with ‘Char’ 
    Expected type: [Char] -> Set Char 
     Actual type: [GHC.Exts.Item (Set Char)] -> Set Char 
    In the expression: ['0' .. '9'] :: Set Char 
    In an equation for ‘it’: it = ['0' .. '9'] :: Set Char 

Weiß jemand, was hier vor sich geht?

+1

Es heißt im Fehler: 'Keine Instanz für (GHC.Exts.IsList (Set Int))'. 'Data.Set' definiert keine Instanz für' IsList'. Sie können die Instanz selbst ganz einfach schreiben, hier ist die Klasse: http://hackage.haskell.org/package/base-4.7.0.0/docs/GHC-Exts.html#g:14 – user2407038

Antwort

7

Es ist nur eine triviale Instanz definiert in the source.

{-# LANGUAGE TypeFamilies #-} 

instance IsList (Set a) where 
    type Item (Set a) = a 
    fromList = Data.Set.fromList 
    toList = Data.Set.toList 

Beachten Sie, dass IsList ist nur für GHC> = 7.8: Sie können Ihre eigene Instanz für Data.Set Verwendung definieren.

+0

Das ist bedauerlich, hatte ich gedacht Diese Instanzen waren eingebaut. –

+2

Beachten Sie auch, dass Sie das 'TypeFamilies'-Pragma verwenden müssen, damit dies funktioniert. –

+2

Vielen Dank, dass Sie darauf hingewiesen haben; Ich habe die Antwort entsprechend bearbeitet. – crockeea