2012-11-03 16 views
7

मैं हैकेल सीख रहा हूं और हास्केल कोड और मॉड्यूल का उपयोग करने के लिए कुछ छोटे परीक्षण कार्यक्रम लिखने का प्रयास करने का फैसला किया। वर्तमान में मैं Cypto.PasswordStore का उपयोग कर पासवर्ड हैश बनाने के लिए पहले तर्क का उपयोग करने की कोशिश कर रहा हूं। मेरे प्रोग्राम का परीक्षण करने के लिए मैं पहले तर्क से हैश बनाने की कोशिश कर रहा हूं और फिर हैश को स्क्रीन पर प्रिंट कर रहा हूं। मैं संदर्भ के रूप में निम्नलिखित लिंक का उपयोग कर रहा हैमैं एक डेटा कैसे डाल सकता हूं। ByteString.Internal.ByteString?

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) 

लेकिन अब मैं कोई लाभ नहीं हुआ सिर्फ परीक्षण erroring हूँ:

import Crypto.PasswordStore 
import System.Environment 

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

मैं निम्न त्रुटि हो रही है। 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

उत्तर

4

आप ByteString आयात नहीं किया है, तो यह putStrLn की स्ट्रिंग संस्करण का उपयोग करने की कोशिश कर रहा है। मैंने String->ByteString रूपांतरण के लिए toBS प्रदान किया है।

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

धन्यवाद ! यह मेरे लिए काम करता है। कोड एक बहिष्कृत समारोह के बारे में चेतावनी देता है लेकिन जवाब मुझे चाहिए। _ चेतावनी: 'BputStrLn ' (डेटा.बेटस्ट्रिंग से आयातित) के उपयोग में: बहिष्कृत:" डेटा का उपयोग करें। ByteString.Char8.putStrLn इसके बजाय – NerdGGuy

+1

@NerdGGuy चलो' डेटा.बेटस्ट्रिंग 'से पूरी तरह से छुटकारा पाएं और बस ' ।। Data.ByteString.Char8' बजाय तो (संपादित देखें) – AndrewC

+0

ग्रेट का उपयोग Data.ByteString.Char8 मेरे लिए समझ में आता है – NerdGGuy

4

आप दो कुछ अलग करना है की कोशिश करो। सबसे पहले, makePassword आईओ में है, इसलिए आपको परिणाम को एक नाम पर बांधना होगा और फिर नाम को आईओ फ़ंक्शन में पास करना होगा। दूसरे, आप 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 

से आईओ कार्यों आयात करने के लिए या, आप कहीं और पासवर्ड परिणाम का उपयोग नहीं किया जाएगा की जरूरत है, तो आप दो कार्यों सीधे कनेक्ट करने के लिए बाँध का उपयोग कर सकते हैं:

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

आप बी के रूप में योग्य Data.ByteString आयात मतलब है इसके अलावा एक और त्रुटि:।? नहीं किया जा सका अपेक्षित प्रकार 'बीबीटेस्ट्रिंग' वास्तविक प्रकार 'स्ट्रिंग' अपेक्षित प्रकार के साथ: [बीबीटेस्ट्रिंग] वास्तविक प्रकार: [स्ट्रिंग] 'सिर' के पहले तर्क में, अर्थात् 'तर्क' पहले तर्क में 'मेकपास्वा' का ord ', अर्थात् '(सिर तर्क)' – NerdGGuy

+1

हाँ, निश्चित। मुझे प्री-कॉफी पोस्ट करने के लिए सिखाओ –

संबंधित मुद्दे