Salut, c'est encore moi
Je n'aime pas beaucoup les blocs do, et m'efforce donc de les supprimer.
Sur le coup, j'ai un peu de mal.
Le code avec le do:Je souhaite donc supprimer le do dans l'action isElfFile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 import qualified Data.ByteString.Lazy as L hasElfMagic :: L.ByteString -> Bool hasElfMagic content = L.take 4 content == elfMagic where elfMagic = L.pack [0x7f, 0x45, 0x4c, 0x46] isElfFile :: FilePath -> IO Bool isElfFile path = do content <- L.readFile path return (hasElfMagic content)
Ma première idée a été d'utiliser l'opérateur >>=, puis j'ai essayé de chainer les fonctions avec des . (points)
Rien n'y fait, Haskell ne me laissera pas mélanger des actions et des fonctions :
J'ai fini par trouver une solution avec une fonction lambda, mais je trouve que c'est beaucoup de bazar pour une petite chose
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 Prelude> :load isElf [1 of 1] Compiling Main ( isElf.hs, interpreted ) isElf.hs:8:37: Couldn't match expected type `IO Bool' against inferred type `Bool' In the second argument of `(>>=)', namely `hasElfMagic' In the expression: L.readFile path >>= hasElfMagic In the definition of `isElfFile': isElfFile path = L.readFile path >>= hasElfMagic Failed, modules loaded: none. Prelude> :load isElf [1 of 1] Compiling Main ( isElf.hs, interpreted ) isElf.hs:8:26: Couldn't match expected type `L.ByteString' against inferred type `IO L.ByteString' In the second argument of `(.)', namely `L.readFile' In the expression: hasElfMagic . L.readFile In the definition of `isElfFile': isElfFile = hasElfMagic . L.readFile Failed, modules loaded: none.
Existe-t-il une solution plus concise ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part isElfFile path = L.readFile path >>= (\contents -> return $ hasElfMagic contents)
Partager