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)