2012-11-03 12 views
7

Tôi đang học haskell và quyết định thử viết một số chương trình thử nghiệm nhỏ để sử dụng mã Haskell và sử dụng các mô-đun. Hiện tại tôi đang cố gắng sử dụng đối số đầu tiên để tạo một mật khẩu băm bằng cách sử dụng Cypto.PasswordStore. Để kiểm tra chương trình của tôi, tôi đang cố tạo băm từ đối số đầu tiên và sau đó in băm vào màn hình.Làm cách nào để tôi đặtStrLn một Data.ByteString.Internal.ByteString?

import Crypto.PasswordStore 
import System.Environment 

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

Tôi nhận được lỗi sau:

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) 

Tôi đã sử dụng các liên kết sau đây là tài liệu tham khảo nhưng tôi bây giờ chỉ cần thử nghiệm-erroring vô ích. 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

Trả lời

4

Bạn chưa nhập ByteString, vì vậy, nó đang cố gắng sử dụng phiên bản String của putStrLn. Tôi đã cung cấp toBS cho chuyển đổi String->ByteString.

Hãy thử

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

Cảm ơn ! Điều này làm việc cho tôi. Mã này cảnh báo về một hàm bị phản đối nhưng câu trả lời là những gì tôi cần. _Cảnh báo: Trong việc sử dụng 'B.putStrLn ' (được nhập từ Data.ByteString): Không được chấp nhận:" Sử dụng dữ liệu.ByteString.Char8.putStrLn thay thế_ – NerdGGuy

+1

@NerdGGuy Hãy loại bỏ 'Data.ByteString' hoàn toàn và chỉ sử dụng' Data.ByteString.Char8' thay vì sau đó (xem chỉnh sửa) – AndrewC

+0

Tuyệt vời Sử dụng Data.ByteString.Char8 có ý nghĩa với tôi – NerdGGuy

4

Bạn cần phải làm hai việc khác nhau. Đầu tiên, makePassword là trong IO, vì vậy bạn cần phải kết buộc kết quả với tên và sau đó chuyển tên cho hàm IO. Thứ hai, bạn cần phải nhập khẩu chức năng IO từ 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 

Hoặc, nếu bạn sẽ không được sử dụng kết quả mật khẩu bất cứ nơi nào khác, bạn có thể sử dụng ràng buộc để kết nối hai chức năng trực tiếp:

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

bạn có nghĩa là nhập Dữ liệu.ByteString đủ điều kiện nhập B? Ngoài ra còn một lỗi nữa: Không thể phù hợp với loại dự kiến ​​'B.ByteString ' với loại thực tế' Chuỗi' Loại dự kiến: [B.ByteString] Loại thực tế: [String] Trong đối số đầu tiên của 'đầu ', cụ thể là' args ' Trong đối số đầu tiên của 'makePassw ord ', cụ thể là '(head args)' – NerdGGuy

+1

yep, cố định. dạy tôi đăng bài trước cà phê –

Các vấn đề liên quan