2012-11-03 7 views
7

Uczę się haskell i postanowiłem spróbować napisać kilka małych programów testowych, aby uzyskać dostęp do kodu Haskell i modułów. Obecnie próbuję użyć pierwszego argumentu do utworzenia skrótu hasła za pomocą Cypto.PasswordStore. Aby przetestować mój program, próbuję utworzyć skrót z pierwszego argumentu, a następnie wydrukować skrót do ekranu.Jak mogę putStrLn a Data.ByteString.Internal.ByteString?

import Crypto.PasswordStore 
import System.Environment 

main = do 
    args <- getArgs 
    putStrLn (makePassword (head args) 12) 

Dostaję następujący błąd:

testmakePassword.hs:8:19: 
    Couldn't match expected type `String' 
      with actual type `IO Data.ByteString.Internal.ByteString' 
    In the return type of a call of `makePassword' 
    In the first argument of `putStrLn', namely 
     `(makePassword (head args) 12)' 
    In a stmt of a 'do' block: putStrLn (makePassword (head args) 12) 

Używam następujących linków jako odniesienia, ale teraz jestem po prostu metodą prób erroring bezskutecznie. http://hackage.haskell.org/packages/archive/bytestring/0.9.0.4/doc/html/Data-ByteString-Internal.html http://hackage.haskell.org/packages/archive/pwstore-purehaskell/2.1/doc/html/Crypto-PasswordStore.html

Odpowiedz

4

Nie importowane ByteString, więc próbuje użyć wersji Ciąg putStrLn. Podaję toBS dla konwersji String->ByteString.

Spróbuj

import Crypto.PasswordStore 
import System.Environment 
import qualified Data.ByteString.Char8 as B 

toBS = B.pack 

main = do 
    args <- getArgs 
    makePassword (toBS (head args)) 12 >>= B.putStrLn 
+0

Thanks ! To działa dla mnie. Kod ostrzega o przestarzałej funkcji, ale odpowiedź jest tym, czego potrzebowałem. _Ostrzeżenie: Podczas używania 'B.putStrLn ' (importowane z Data.ByteString): Przestarzałe:" Użyj Data.ByteString.Char8.putStrLn zamiast_ – NerdGGuy

+1

@NerdGGuy Pozbądźmy się całkowicie 'Data.ByteString' i po prostu użyj'. Data.ByteString.Char8' zamiast tego (patrz edytuj) – AndrewC

+0

Świetnie, używanie Data.ByteString.Char8 ma dla mnie sens – NerdGGuy

4

trzeba zrobić dwie rzeczy inaczej. Po pierwsze, makePassword jest w IO, więc musisz powiązać wynik z nazwą, a następnie przekazać nazwę do funkcji IO. Po drugie, trzeba importować funkcje IO z Data.ByteString

import Crypto.PasswordStore 
import System.Environment 
import qualified Data.ByteString as B 

main = do 
    args <- getArgs 
    pwd <- makePassword (B.pack $ head args) 12 
    B.putStrLn pwd 

Lub, jeśli nie będzie używany wynik hasło nigdzie indziej, można użyć wiążą się bezpośrednio połączyć dwie funkcje:

main = do 
    args <- getArgs 
    B.putStrLn =<< makePassword (B.pack $ head args) 12 
+0

czy masz na myśli import kwalifikowanego Data.ByteString jako B? Jeszcze jeden błąd: Nie można dopasuj oczekiwany typ 'B.ByteString ' z rzeczywistym typem' String' Oczekiwany typ: [B.ByteString] Typ rzeczywisty: [String] W pierwszym argumencie z 'head ', a mianowicie' args' W pierwszym argumencie z 'makePassw ord ', a mianowicie '(head args)' – NerdGGuy

+1

tak, naprawione. naucz mnie pisać po kawie –

Powiązane problemy