Haskell & Scrypt: как получить зашифрованный хеш

* Извините за основной вопрос, только начал изучать Haskell.

Я пытаюсь написать функцию, которая получит строку и вернет зашифрованный хеш.

На данный момент я пришел к выводу:

encrypt :: ByteString -> ByteString
encrypt = do
    x <- Crypto.Scrypt.encryptPassIO' (Pass "secret")
    fmap Crypto.Scrypt.getEncryptedPass x

Однако я получаю ошибку:

• Couldn't match expected type ‘ByteString’
              with actual type ‘IO ByteString’
• In a stmt of a 'do' block: x <- encryptPassIO' (Pass plain)
  In the expression:
    do { x <- encryptPassIO' (Pass plain);
         fmap Crypto.Scrypt.getEncryptedPass x }
  In an equation for ‘encrypt’:
      encrypt plain
        = do { x <- encryptPassIO' (Pass plain);
               fmap Crypto.Scrypt.getEncryptedPass x }

Любая идея, как я могу избавиться от IO?

Спасибо!

1 ответ

Решение

Вместо того, чтобы избавиться от IOнужно настроить encrypt вернуть IO ByteString, encryptPassIO' нужны случайные данные для соли, которую он получает из IO Монада, так что вы застряли там.

import Crypto.Scrypt (encryptPassIO', getEncryptedPass)
encrypt :: ByteString -> IO ByteString
encrypt = fmap getEncryptedPass . encryptPassIO' . Pass

Вместо do нотация, я использовал encryptPassIO' . Pass чтобы получить IO EncryptedPass значение из аргумента. Затем мы используем fmap поднимать getEncryptedPass :: EncryptedPass -> ByteString в IO монада.

Вы могли бы использовать do нотация, но ИМО fmap делает это чище:

encrypt pass = do
    x <- encryptPassIO' pass
    return (getEncryptedPass x)
Другие вопросы по тегам