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ように調整する必要があります。モナドから取得するソルトに使用するランダムなデータが必要なので、そこで立ち往生しています。encryptIO 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 に答える