IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Haskell Discussion :

Après caball install, comment charger mon module dans GHCi ? et dans runHaskell ? [Débutant(e)]


Sujet :

Haskell

  1. #1
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut Après caball install, comment charger mon module dans GHCi ? et dans runHaskell ?
    Bonjour à tous,

    je reviens ici après un long temps d'absence. J'ai un nouveau projet, que je compte faire en Haskell (j'ai programmé précédemment en OCaml). Pour cela, j'ai besoin d'utiliser Yaml, via un module que je trouvé sur HackageDB, à savoir data-object-yaml

    contexte :
    Je suis sous Windows, j'ai installé la plateforme pour Windows, et testé avec succès : GHCi, runHaskell, cabal

    ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cabal install data-object-yaml
    ce que j'ai obtenu
    tout ok apparemment : la commande ghc-pkg me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    J:/Program Files/Haskell Platform/2010.2.0.0\lib\package.conf.d:
        Cabal-1.8.0.6
        GLUT-2.1.2.1
        HTTP-4000.0.9
        HUnit-1.2.2.1
        OpenGL-2.2.3.0
        QuickCheck-2.1.1.1
        Win32-2.2.0.2
        array-0.3.0.1
        base-3.0.3.2
        base-4.2.0.2
        bin-package-db-0.0.0.0
        bytestring-0.9.1.7
        cgi-3001.1.7.3
        containers-0.3.0.0
        deepseq-1.1.0.0
        directory-1.0.1.1
        (dph-base-0.4.0)
        (dph-par-0.4.0)
        (dph-prim-interface-0.4.0)
        (dph-prim-par-0.4.0)
        (dph-prim-seq-0.4.0)
        (dph-seq-0.4.0)
        extensible-exceptions-0.1.1.1
        ffi-1.0
        fgl-5.4.2.3
        filepath-1.1.0.4
        (ghc-6.12.3)
        (ghc-binary-0.5.0.2)
        ghc-prim-0.2.0.0
        haskell-platform-2010.2.0.0
        haskell-src-1.0.1.3
        haskell98-1.0.1.1
        hpc-0.5.0.5
        html-1.0.1.2
        integer-gmp-0.2.0.1
        mtl-1.1.0.2
        network-2.2.1.7
        old-locale-1.0.0.2
        old-time-1.0.0.5
        parallel-2.2.0.1
        parsec-2.1.0.1
        pretty-1.0.1.1
        process-1.0.1.3
        random-1.0.0.2
        regex-base-0.93.2
        regex-compat-0.93.1
        regex-posix-0.94.2
        rts-1.0
        stm-2.1.2.1
        syb-0.1.0.2
        template-haskell-2.4.0.1
        time-1.1.4
        xhtml-3000.2.0.1
        zlib-0.5.2.0
     
    J:\Documents and Settings\Toutlemonde\Application Data\ghc\i386-mingw32-6.12.3\package.conf.d:
        attempt-0.3.0
        convertible-text-0.3.0.6
        data-object-0.3.1.5
        data-object-yaml-0.3.3.1
        enumerator-0.4.2
        failure-0.1.0
        text-0.10.0.0
        transformers-0.2.2.0
        yaml-0.4.1
    là où je bloque :
    ben, je suppose que c'est un truc idiot qui bloque, mais :
    - GHCi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :module + Data.Object.Yaml
    me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <no location info>:
        Could not find module `Data.Object.Yaml':
          it is not a module in the current program, or in any known package.
    -runHaskell test.hs
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import Data.Object.Yaml
    me renvoie ... rien, il tourne indéfiniment ...

    ce que j'ai consulté sans succès
    realworldhaskell
    et
    learnyouahaskell.com
    sans oublier Google, qui cette fois, n'a pas été mon ami ...


    => svp, quelqu'un peut me mettre sur la piste ?

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Et en essayant avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    runhaskell -package data-object-yaml tonfichier.hs
    ou un truc du genre ? Idem avec ghci ?

    Ou plus généralement, pour ton projet, tu fais ton import en haut et avec ghc, cette fois j'en suis sûr y'a une option -package, donc tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ghc -package data-object-yaml foo.hs
    Ou alors carrément utiliser ghc --make foo.hs et ghc va deviner toutes les dépendances tout seul et les lier à ton code.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Alp Voir le message
    Et en essayant avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    runhaskell -package data-object-yaml tonfichier.hs
    ou un truc du genre ? Idem avec ghci ?

    Ou plus généralement, pour ton projet, tu fais ton import en haut et avec ghc, cette fois j'en suis sûr y'a une option -package, donc tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ghc -package data-object-yaml foo.hs
    Ou alors carrément utiliser ghc --make foo.hs et ghc va deviner toutes les dépendances tout seul et les lier à ton code.
    Merci de l'aide.

    En fait, aujourd'hui, j'ai bien progressé. ce qui ne marchait par hier fonctionne aujourd'hui. Entre temps, je n'ai fait qu'éteindre et allumer l'ordi. Donc je suppose qu'un fichier de configuration s'est mis à jour dans ce processus.

    Donc la solution, c'est de tout fermer et tout relancer après un cabal install. Il doit y avoir plus joli, mais ça ira pour l'instant.

    Néanmoins, toujours bloqué,mais un peu plus loin :

    1. ce qui marche maintenant dans GHCi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :m + Data.Object
    :m + Data.Object.Yaml
    conduit à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Prelude Data.List Data.Object Data.Object.Yaml>
    ce qui est de bon augure
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    :browse Data.Object
    renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    data Object key val
      = Mapping [(key, Object key val)]
      | Sequence [Object key val]
      | Scalar val
    data ObjectExtractError
      = ExpectedScalar
      | ExpectedSequence
      | ExpectedMapping
      | MissingKey String
    data Scalar
      = Numeric Rational
      | Text text-0.10.0.0:Data.Text.Internal.Text
      | Binary Data.ByteString.Internal.ByteString
      | Bool Bool
      | Timestamp time-1.1.4:Data.Time.Clock.UTC.UTCTime
      | Null
    type ScalarObject = Object String Scalar
    type StringObject = Object String String
    type TextObject =
      Object
        text-0.10.0.0:Data.Text.Internal.Text
        text-0.10.0.0:Data.Text.Internal.Text
    fromMapping ::
      (Control.Failure.Failure ObjectExtractError m) =>
      Object k v -> m [(k, Object k v)]
    fromScalar ::
      (Control.Failure.Failure ObjectExtractError m) => Object k v -> m v
    fromSequence ::
      (Control.Failure.Failure ObjectExtractError m) =>
      Object k v -> m [Object k v]
    lookupMapping ::
      (Show k, Eq k, Control.Failure.Failure ObjectExtractError m) =>
      k -> [(k, Object k v)] -> m [(k, Object k v)]
    lookupObject ::
      (Show k, Eq k, Control.Failure.Failure ObjectExtractError m) =>
      k -> [(k, Object k v)] -> m (Object k v)
    lookupScalar ::
      (Show k, Eq k, Control.Failure.Failure ObjectExtractError m) =>
      k -> [(k, Object k v)] -> m v
    lookupSequence ::
      (Show k, Eq k, Control.Failure.Failure ObjectExtractError m) =>
      k -> [(k, Object k v)] -> m [Object k v]
    mapKeys ::
      (keyIn -> keyOut) -> Object keyIn val -> Object keyOut val
    mapKeysValues ::
      (keyIn -> keyOut)
      -> (valIn -> valOut)
      -> Object keyIn valIn
      -> Object keyOut valOut
    mapKeysValuesA ::
      (Control.Applicative.Applicative f) =>
      (keyIn -> f keyOut)
      -> (valIn -> f valOut)
      -> Object keyIn valIn
      -> f (Object keyOut valOut)
    mapKeysValuesM ::
      (Monad m) =>
      (keyIn -> m keyOut)
      -> (valIn -> m valOut)
      -> Object keyIn valIn
      -> m (Object keyOut valOut)
    mapValues ::
      (valIn -> valOut) -> Object key valIn -> Object key valOut
    ce qui ressemble à quelque chose qui m'intéresse, bien que je suis très loin de tout comprendre.

    puis un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Prelude Data.List Data.Object Data.Object.Yaml> Scalar 1
    renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Loading package bytestring-0.9.1.7 ... linking ... done.
    Loading package Win32-2.2.0.2 ... linking ... done.
    Loading package old-locale-1.0.0.2 ... linking ... done.
    Loading package time-1.1.4 ... linking ... done.
    Loading package array-0.3.0.1 ... linking ... done.
    Loading package containers-0.3.0.0 ... linking ... done.
    Loading package deepseq-1.1.0.0 ... linking ... done.
    Loading package failure-0.1.0 ... linking ... done.
    Loading package text-0.10.0.0 ... linking ... done.
    Loading package data-object-0.3.1.5 ... linking ... done.
    Scalar 1
    it :: Object key Integer
    ça a une bonne tête, bien que je ne connaisse pas le début du commencement de tous ces packages
    et ainsi de suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mapping [("fj",Scalar 3),("ghkhk",Scalar 5)]
    2.1 là où je bloque (1/2):
    il y a un runtest fourni avec mon package data-object-yaml-0.3.3.1.tar.gz :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Prelude Data.List Data.Object Data.Object.Yaml> :load "runtests.hs"
     
     
    runtests.hs:3:7:
        Could not find module `Test.Framework.Providers.HUnit':
          Use -v to see a list of the files searched for.
    Failed, modules loaded: none.
    Prelude Data.List Data.Object Data.Object.Yaml> :m + test.Framework.Providers.HUnit
    syntax:  :module [+/-][*]M1 ...[*]Mn
    Prelude Data.List Data.Object Data.Object.Yaml> :m + Test.Framework.Providers.HUnit
     
     
    <no location info>:
        Could not find module `Test.Framework.Providers.HUnit':
          it is not a module in the current program, or in any known package.
    2.2 là où je bloque (2/2):
    au diable le runtest, ce qui m'intéresse, c'est la fonction decodeFile

    Code - **en gras, la fonction decodeFile** : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    :browse Data.Object.Yaml
    class (Eq a) => IsYamlScalar a where
      fromYamlScalar :: YamlScalar -> a
      toYamlScalar :: a -> YamlScalar
    data ParseException
      = NonScalarKey
      | UnknownAlias {_anchorName :: Text.Libyaml.AnchorName}
      | UnexpectedEvent {_received :: Maybe Text.Libyaml.Event,
                         _expected :: Maybe Text.Libyaml.Event}
      | InvalidYaml (Maybe String)
    type YamlObject = Data.Object.Object YamlScalar YamlScalar
    data YamlScalar
      = YamlScalar {value :: Data.ByteString.Internal.ByteString,
                    tag :: Text.Libyaml.Tag,
                    style :: Text.Libyaml.Style}
    data ParseException
      = ... | UnknownAlias {_anchorName :: Text.Libyaml.AnchorName} | ...
    data ParseException
      = ...
      | UnexpectedEvent {..., _expected :: Maybe Text.Libyaml.Event}
      | ...
    data ParseException
      = ...
      | UnexpectedEvent {_received :: Maybe Text.Libyaml.Event, ...}
      | ...
    decode ::
      (Control.Failure.Failure ParseException m,
       IsYamlScalar k,
       IsYamlScalar v) =>
      Data.ByteString.Internal.ByteString -> m (Data.Object.Object k v)
    decodeFile ::
      (Control.Failure.Failure ParseException m,
       IsYamlScalar k,
       IsYamlScalar v) =>
      FilePath -> IO (m (Data.Object.Object k v))
    encode ::
      (IsYamlScalar k, IsYamlScalar v) =>
      Data.Object.Object k v -> Data.ByteString.Internal.ByteString
    encodeFile ::
      (IsYamlScalar k, IsYamlScalar v) =>
      FilePath -> Data.Object.Object k v -> IO ()
    fromYamlObject ::
      (IsYamlScalar k, IsYamlScalar v) =>
      YamlObject -> Data.Object.Object k v
    data YamlScalar = YamlScalar {..., style :: Text.Libyaml.Style}
    data YamlScalar = YamlScalar {..., tag :: Text.Libyaml.Tag, ...}
    toYamlObject ::
      (IsYamlScalar k, IsYamlScalar v) =>
      Data.Object.Object k v -> YamlObject
    data YamlScalar
      = YamlScalar {value :: Data.ByteString.Internal.ByteString, ...}

    hélas, dans GHCi :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >decodeFile "test_Yaml.txt"
     
     
    <interactive>:1:0:
        No instance for (Control.Failure.Failure ParseException m)
          arising from a use of `decodeFile' at <interactive>:1:0-25
        Possible fix:
          add an instance declaration for
          (Control.Failure.Failure ParseException m)
        In the expression: decodeFile "test_Yaml.txt"
        In the definition of `it': it = decodeFile "test_Yaml.txt"
    qui pourrait me débloquer ?

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Pour le premier soucis, il te suffit d'installer HUnit. Le *test* dépend de HUnit, mais pas la lib, donc ça ne te force pas à l'installer quand t'installes la lib. Par contre c'est indispensable pour le test. Donc un cabal install HUnit devrait régler le soucis.

    Le deuxième soucis est du au fait que, étant donnée la signature de decodeFile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    decodeFile ::
      (Control.Failure.Failure ParseException m,
       IsYamlScalar k,
       IsYamlScalar v) =>
      FilePath -> IO (m (Data.Object.Object k v))
    Et que la seule instance de ParseException liée aux exceptions est de la classe Exception, en fouillant on trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Exception e => Failure e IO
    (ici : http://hackage.haskell.org/packages/...html#t:Failure )

    Donc quand on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    decodeFile "test_Yaml.txt"
    Ca nous oblige à ce que le "m" de la signature de decodeFile soit IO d'après ce que tu peux voir sur le lien sur le module Control.Failure. Or dans ton appel, rien ne contraint cela d'où l'erreur, je pense.

    Bosse dans un fichier, en explicitant les signatures et surtout en remplaçant le "m" par IO, et charge ça dans ghci via :l, et tout devrait aller très bien.

  5. #5
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Alp Voir le message
    Pour le premier soucis, il te suffit d'installer HUnit. Le *test* dépend de HUnit, mais pas la lib, donc ça ne te force pas à l'installer quand t'installes la lib. Par contre c'est indispensable pour le test. Donc un cabal install HUnit devrait régler le soucis.
    J'ai donc fait cabal install HUnit.

    Je bloque encore, un peu plus loin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Prelude> :load "runtests.hs"
    [1 of 1] Compiling Main             ( runtests.hs, interpreted )
    Ok, modules loaded: Main.
    *Main> main
    Loading package bytestring-0.9.1.7 ... linking ... done.
    Loading package Win32-2.2.0.2 ... linking ... done.
    Loading package old-locale-1.0.0.2 ... linking ... done.
    Loading package time-1.1.4 ... linking ... done.
    Loading package array-0.3.0.1 ... linking ... done.
    Loading package containers-0.3.0.0 ... linking ... done.
    Loading package syb-0.1.0.2 ... linking ... done.
    Loading package base-3.0.3.2 ... linking ... done.
    Loading package mtl-1.1.0.2 ... linking ... done.
    Loading package regex-base-0.93.2 ... linking ... done.
    Loading package regex-posix-0.94.2 ... linking ... ghc: unable to load package `regex-posix-0.94.2'
    pourtant, regex-posix est installé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    J:/Program Files/Haskell Platform/2010.2.0.0\lib\package.conf.d:
    ...
        HUnit-1.2.2.1 **en fait il était déjà installé **
    ...
        regex-base-0.93.2
        regex-compat-0.93.1
        regex-posix-0.94.2
    ...
    ... étrange, non ? ...
    pas davantage de succès avec ghc --make
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > ghc --make runtests.hs > ghc_runtests.txt 2>&1
     
    Linking runtests.exe ...
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x493): undefined reference to `regerror'
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x4e7): undefined reference to `regerror'
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x158d): undefined reference to `regcomp'
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x15a9): undefined reference to `regfree'
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x1787): undefined reference to `regexec'
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x1cff): undefined reference to `regexec'
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x1e6a): undefined reference to `regexec'
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x3f17): undefined reference to `regexec'
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x44a1): undefined reference to `regexec'
    J:\Program Files\Haskell Platform\2010.2.0.0\lib\extralibs\regex-posix-0.94.2\ghc-6.12.3/libHSregex-posix-0.94.2.a(Wrap.o):fake:(.text+0x44fa): more undefined references to `regexec' follow
    collect2: ld returned 1 exit status




    quant à la suite de ton message, ça vole très haut pour moi, misérable ver de terre dans le monde Haskell, loin d'avoir tout compris aux monads ... je creuse, je creuse, mais pas encore très vif le misérable ver de terre ...

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Pour l'erreur que tu as liée aux regex, je crois qu'il te manque la bibliothèque C correspondant à la bibliothèque de regex utilisée par le package haskell que tu utilises. Je ne sais pas exactement laquelle c'est, mais il faut que tu trouves et que tu la mette à dispo de ghc dans un coin de ton Windows, et tu peux spécifier tout ça via les options --extra-lib-dirs et --extra-include-dirs quand il y a besoin.

    Pour la deuxième partie, oui c'est compliqué, mais déjà familiarise toi un peu plus avec les monades et ça ira mieux. Tu comprendras l'essentiel : il faut que m soit IO dans la signature de decodeFile.

  7. #7
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Alp Voir le message
    Pour la deuxième partie, oui c'est compliqué, mais déjà familiarise toi un peu plus avec les monades et ça ira mieux. Tu comprendras l'essentiel : il faut que m soit IO dans la signature de decodeFile.

    Bon, un peu au pif, après quelques tatonnements : ça marche !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import Data.Object
    import Data.Object.Yaml
     
    main :: IO ()
    main = do
        fileData_IO <- decodeFile "test_Yaml.txt"::IO (IO (Data.Object.Object String String))
        fileData <- fileData_IO
        print fileData
    puis, dans GHCi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main
    Sequence [Scalar "Casablanca",Scalar "Bourgogne Casablanca",Scalar "La R\232gle du jeu",Scalar "Titanic"]
    gros progrès !!!
    maintenant j'espère pouvoir jouer avec ...


    le m'enquiquine

    et en tous cas, un grand merci Alp !

  8. #8
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par james-mi Voir le message
    Bon, un peu au pif, après quelques tatonnements : ça marche !!!

    ...

    et en tous cas, un grand merci Alp !
    je veux le passer en [résolu] mais impossible d'éditer ...un admin / modo peut le faire ?

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Si y'en a un qui passe par là il le fera

    Content que ton soucis soit résolu, hésite pas à repasser si t'as d'autres questions.
    (ou à venir sur #haskell.fr sur irc.freenode.net )

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Tout de même, cette signature en IO (IO .... ) je la trouve tordue.

    D'après Control.Failure, le m peut être aussi [] ou Maybe, je me demande ci ce n'est pas plus approprié.

  11. #11
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par viro Voir le message
    Tout de même, cette signature en IO (IO .... ) je la trouve tordue.

    D'après Control.Failure, le m peut être aussi [] ou Maybe, je me demande ci ce n'est pas plus approprié.
    Ben moi aussi. L'auteur m'a aimablement donné des indications (que je ne pige pas vraiment) :

    Citation Envoyé par james-mi
    > 1. Why so complex ? (IO (IO (Data.Object.Object String String))
    > Well, you don't need to answer if it's too much of a neebie question, I may
    > understand in some weeks of it, when I'm getting used with the whole thing
    > -is the module the right one for my needs ? I've seen that you've written several, may
    > be you would advice another one ?
    Citation Envoyé par Michael Snoyman
    Because the inner one is not necessarily IO. It could be Maybe or any
    other instance of Failure. This is just a way or generically dealing
    with parse errors. Error handling techniques can be a bit of a complex
    topic unfortunately. You might want to read the Failure wiki page:
    http://haskell.org/haskellwiki/Failure
    I think this is the right module to use. An older version of
    data-object-yaml, before the alias support code was added, will
    probably address your order issue immediately. Otherwise, I don't know
    how long it will take for Anton to get back to me.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par james-mi Voir le message
    Ben moi aussi. L'auteur m'a aimablement donné des indications (que je ne pige pas vraiment) :
    Il dit que le type interne n'est pas forcément IO, mais n'importe lequel qui appartient aussi à la classe Failure. ( si on regarde Control.Failure, il y a IO, Maybe et [] de définis, mais rien empèche d'en ajouter soi-même )

    Il explique que l'intérêt est de proposer un moyen générique(généralisé) de traiter les erreurs. Selon les propriétés du type interne utilisé, on peut probablement faire quelque chose de différent.

    Dans le cas de decodeFile, tout ca me paraît relever du bazooka logiciel, parce qu'on a le choix entre:
    (rappel)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Failure ParseException m, IsYamlScalar k, IsYamlScalar v) => FilePath -> IO (m (Object k v))
    m peut donc être IO, Maybe ou [] ce qui donne
    1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (IsYamlScalar k, IsYamlScalar v) => FilePath -> IO (IO (Object k v))
    2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (IsYamlScalar k, IsYamlScalar v) => FilePath -> IO (Maybe (Object k v))
    3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (IsYamlScalar k, IsYamlScalar v) => FilePath -> IO ([Object k v])
    en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res <- decodeFile ......
    1. En cas d'erreur, une exception sera générée, à intercepter par catch, handle, ou une fonction du genre.
    2. En cas d'erreur, on récupère Nothing, sinon Just obj -- obj étant l'objet décodé.
    3. En cas d'erreur, on récupère [], sinon [obj] -- obj étant l'objet décodé. (ici, dans une liste d'un seul élémént)


    Note, dans le cas 1, on peut remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    action_a_faire <- decodeFile ....
    resultat <- action_a_faire
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat <- join $ decodeFile ......

    A mon avis dans ton cas le mieux est de faire avec Maybe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    main :: IO ()
    main = do
        fileData_Maybe <- decodeFile "test_Yaml.txt"  -- a mon avis pas besoin de la signature
        case fileData_Maybe of
          Nothing       -> putStrLn "ooops, ca a pas marche."
          Just fileData -> print fileData

  13. #13
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par viro Voir le message
    Il dit que le type interne n'est pas forcément IO, mais n'importe lequel qui appartient aussi à la classe Failure.
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat <- join $ decodeFile ......
    Ok, je prends bonne note de tout ça

    Citation Envoyé par viro Voir le message
    A mon avis dans ton cas le mieux est de faire avec Maybe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    main :: IO ()
    main = do
        fileData_Maybe <- decodeFile "test_Yaml.txt"  -- a mon avis pas besoin de la signature
        case fileData_Maybe of
          Nothing       -> putStrLn "ooops, ca a pas marche."
          Just fileData -> print fileData
    ça coince :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [1 of 1] Compiling Main             ( jmc_test_decode-encode File.hs, interpreted )
     
    jmc_test_decode-encode File.hs:25:22:
        Ambiguous type variable `k' in the constraints:
          `IsYamlScalar k'
            arising from a use of `decodeFile'
                         at jmc_test_decode-encode File.hs:25:22-47
          `Show k'
            arising from a use of `print'
                         at jmc_test_decode-encode File.hs:28:23-36
        Probable fix: add a type signature that fixes these type variable(s)
     
    jmc_test_decode-encode File.hs:25:22:
        Ambiguous type variable `v' in the constraints:
          `IsYamlScalar v'
            arising from a use of `decodeFile'
                         at jmc_test_decode-encode File.hs:25:22-47
          `Show v'
            arising from a use of `print'
                         at jmc_test_decode-encode File.hs:28:23-36
        Probable fix: add a type signature that fixes these type variable(s)

    mais ça fonctionne avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    main :: IO ()
    main = do
        fileData_Maybe <- decodeFile "test_Yaml_in.txt"  -- a mon avis pas besoin de la signature // OK, je la mets plus simple plus loin
        case fileData_Maybe of
          Nothing       -> putStrLn "ooops, ca a pas marche."
          Just fileData -> print (fileData::Data.Object.Object String String)
    et je suis d'accord que c'est plus simple de gérer le Maybe ...
    merci pour l'astuce

  14. #14
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 84
    Points
    84
    Par défaut
    Et même un peu plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import Data.Object
    import Data.Object.Yaml
     
     
    main :: IO ()
    main = do
        fileData_Maybe <- decodeFile "sandbox.yml"
        case fileData_Maybe of
          Nothing       -> putStrLn "ooops, ca a pas marche."
          Just fileData -> print (fileData::StringObject)
    Je passe en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment charger mon document XML!
    Par moon5 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 30/07/2007, 16h56
  2. Réponses: 2
    Dernier message: 26/12/2006, 16h09
  3. Réponses: 17
    Dernier message: 19/01/2006, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo