Haskell & Scrypt:如何获取加密后的哈希值
Haskell & Scrypt: How to get the encrypted hash
*基础问题不好意思,刚开始学习Haskell。
我正在尝试编写一个函数来获取一个字符串和 return 一个加密的散列。
我暂时想到的是:
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 吗?
谢谢!
与其摆脱 IO
,不如将 encrypt
调整为 return 和 IO ByteString
。 encryptPassIO'
需要随机数据用于盐,它从 IO
monad 获取,所以你被困在那里。
import Crypto.Scrypt (encryptPassIO', getEncryptedPass)
encrypt :: ByteString -> IO ByteString
encrypt = fmap getEncryptedPass . encryptPassIO' . Pass
而不是 do
符号,我使用 encryptPassIO' . Pass
从参数中获取 IO EncryptedPass
值。然后我们使用 fmap
将 getEncryptedPass :: EncryptedPass -> ByteString
提升到 IO
monad。
您可以使用 do
表示法,但 IMO fmap
使此更清晰:
encrypt pass = do
x <- encryptPassIO' pass
return (getEncryptedPass x)
*基础问题不好意思,刚开始学习Haskell。
我正在尝试编写一个函数来获取一个字符串和 return 一个加密的散列。
我暂时想到的是:
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 吗?
谢谢!
与其摆脱 IO
,不如将 encrypt
调整为 return 和 IO ByteString
。 encryptPassIO'
需要随机数据用于盐,它从 IO
monad 获取,所以你被困在那里。
import Crypto.Scrypt (encryptPassIO', getEncryptedPass)
encrypt :: ByteString -> IO ByteString
encrypt = fmap getEncryptedPass . encryptPassIO' . Pass
而不是 do
符号,我使用 encryptPassIO' . Pass
从参数中获取 IO EncryptedPass
值。然后我们使用 fmap
将 getEncryptedPass :: EncryptedPass -> ByteString
提升到 IO
monad。
您可以使用 do
表示法,但 IMO fmap
使此更清晰:
encrypt pass = do
x <- encryptPassIO' pass
return (getEncryptedPass x)