Как я могу положить StrLn Data.ByteString.Internal.ByteString?

Я изучаю haskell и решил попробовать написать несколько небольших тестовых программ, чтобы освоить код на Haskell и использовать модули. В настоящее время я пытаюсь использовать первый аргумент для создания хэша пароля с помощью Cypto.PasswordStore. Чтобы проверить мою программу, я пытаюсь создать хэш из первого аргумента, а затем вывести его на экран.

import Crypto.PasswordStore
import System.Environment

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

Я получаю следующую ошибку:

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)

Я использовал следующие ссылки в качестве ссылок, но сейчас я просто пробные ошибки безрезультатно. 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

2 ответа

Решение

Вы не импортировали ByteString, поэтому он пытается использовать строковую версию putStrLn. Я обеспечил toBS для String->ByteString преобразование.

Пытаться

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

Вы должны сделать две вещи по-разному. Первый, makePassword находится в IO, поэтому вам нужно связать результат с именем, а затем передать имя функции IO. Во-вторых, вам нужно импортировать функции ввода-вывода из 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

Или, если вы нигде не будете использовать результат ввода пароля, вы можете использовать bind для непосредственного соединения двух функций:

main = do
    args <- getArgs
    B.putStrLn =<< makePassword (B.pack $ head args) 12
Другие вопросы по тегам