0

*抱歉这个基本问题,刚开始学习 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 吗?

谢谢!

4

1 回答 1

3

IO您需要调整encrypt以返回一个,而不是摆脱IO ByteStringencryptPassIO'需要随机数据用于盐,它从IO单子中获得,所以你被困在那里。

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

do我习惯于从参数encryptPassIO' . Pass中获取IO EncryptedPass值,而不是符号。然后我们使用fmap提升getEncryptedPass :: EncryptedPass -> ByteStringIO单子。

您可以使用do符号,但 IMOfmap使这个更清晰:

encrypt pass = do
    x <- encryptPassIO' pass
    return (getEncryptedPass x)
于 2016-10-17T22:19:19.460 回答