2012-11-03 6 views
7

Sto imparando haskell e ho deciso di provare a scrivere alcuni piccoli programmi di test per usare il codice Haskell e l'uso dei moduli. Attualmente sto cercando di utilizzare il primo argomento per creare un hash della password utilizzando Cypto.PasswordStore. Per testare il mio programma sto provando a creare un hash dal primo argomento e poi stampare l'hash sullo schermo.Come faccio a mettereStrLn a Data.ByteString.Internal.ByteString?

import Crypto.PasswordStore 
import System.Environment 

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

Sto ottenendo il seguente errore:

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) 

Sto usando i seguenti collegamenti come riferimenti, ma ora sono solo tentativi erroring inutilmente. 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

risposta

4

Non hai importato ByteString, quindi è cercare di utilizzare la versione stringa di putStrLn. Ho fornito toBS per la conversione String->ByteString.

Prova

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

Grazie ! Questo funziona per me. Il codice avvisa di una funzione deprecata ma la risposta è ciò di cui avevo bisogno. _Avvertenza: nell'uso di 'B.putStrLn ' (importato da Data.ByteString): Obsoleto:" Usa Data.ByteString.Char8.putStrLn invece_ – NerdGGuy

+1

@NerdGGuy Eliminiamo del tutto "Data.ByteString" e usiamo semplicemente ' .. Data.ByteString.Char8' invece poi (vedi edit) – AndrewC

+0

Grande Utilizzando Data.ByteString.Char8 senso per me – NerdGGuy

4

quello che dovete fare due cose in modo diverso. Innanzitutto, makePassword è in IO, quindi è necessario associare il risultato a un nome e quindi passare il nome alla funzione IO. In secondo luogo, è necessario importare le funzioni IO da 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 

Oppure, se non si utilizza il risultato password di qualsiasi altro luogo, è possibile utilizzare legano per collegare direttamente i due funzioni:

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

cosa si intende importare Data.ByteString qualificato come B anche un errore di più:.? Could not tipo di corrispondenza atteso 'B.ByteString ' con tipo effettivo' stringa' tipo previsto: [B.ByteString] tipo effettivo: [String] Nel primo argomento di 'testa', vale a dire' args' nel primo argomento di 'makePassw ord ', ovvero '(testa args)' – NerdGGuy

+1

sì, risolto. insegnami a pubblicare il pre-caffè –