2012-11-03 11 views
7

Haskell koduna ve modülleri kullanmaya başlamak için haskell öğreniyorum ve bazı küçük test programlarını yazmayı denemeye karar verdim. Şu anda Cypto.PasswordStore kullanarak şifre karma oluşturmak için ilk argümanı kullanmaya çalışıyorum. Programımı test etmek için ilk argümandan bir karma oluşturmaya çalışıyorum ve sonra hash'ı ekrana yazdırmaya çalışıyorum. Ben referans olarak aşağıdaki bağlantıları kullanarak oldumStrLn a Data.ByteString.Internal.ByteString nasıl yerleştirilir?

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) 

ama sadece boşuna deneme-erroring ben şimdi:

import Crypto.PasswordStore 
import System.Environment 

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

aşağıdaki hatayı alıyorum. 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

cevap

4

Sen bytestring ithal değil, yüzden putStrLn String sürümünü kullanmaya çalışıyor. String->ByteString dönüşümü için toBS sağladım.

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

Teşekkür ! Bu benim için çalışıyor. Kod, kullanımdan kaldırılmış bir işlev hakkında uyarıyor, ancak cevap, ihtiyacım olan şey. _Warning: "B.putStrLn" (Data.ByteString kaynağından içe aktarılan) kullanımında: Kullanımdan kaldırıldı: "Use Data.ByteString.Char8.putStrLn yerine_ – NerdGGuy

+1

@NerdGGuy" Data.ByteString "işlevini tamamen kullanalım ve sadece kullanalım .. Data.ByteString.Char8' yerine daha sonra (düzenleme bakınız) Büyük – AndrewC

+0

kullanma Data.ByteString.Char8 bana mantıklı – NerdGGuy

4

Sen farklı iki şey yapmak zorunda deneyin. İlk olarak, makePassword IO'dadır, bu yüzden sonucu bir adaya bağlamanız ve sonra adı IO işlevine iletmeniz gerekir. Başka hiçbir yerde şifre sonucunu kullanarak olmayacak İkinci olarak, sen 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 

GÇ işlevlerini ithalat gerekir Veya, doğrudan iki işlevi bağlamak için bağlama kullanabilirsiniz:

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

Eğer B nitelikli Data.ByteString içe demek Ayrıca bir daha hata:.? yapılamadı kendilerinden beklenen tipi 'B.ByteString ' edilen türden' dize' ile beklenen türü: [B.ByteString] mevcut tipi: [dize] baş' ilk bağımsız değişken olarak ', yani 'bağımsız değişken ilk argüman makePassw ord ', yani' (baş) ' – NerdGGuy

+1

evet, sabit. kahve öncesi göndermeyi öğret –

İlgili konular