そのよう:モナド変圧器および応用的かもしれない
let maybeReader :: Maybe (ReaderT UDCEnv IO()) =
uploadVersionFilesToCaches s3BucketName <$> maybeFilePath <*> Just gitRepoNamesAndVersions
私はそうであっても同じようReaderTを実行することができます。
let maybeIO :: Maybe (IO()) =
runReaderT <$> maybeReader <*> Just (env, shouldIgnoreLocalCache, verbose)
let
式を使用している限り、すべて正常に動作します。
f :: ... -> ExceptT String IO()
f ... = do
...
runReaderT <$> maybeReader <*> Just (env, shouldIgnoreLocalCache, verbose) -- Error here
undefined
は
を生成します:できるだけ早く私は実際に上記の式でlet
をドロップするように私は省略しています
ExceptT String IO FilePath
代わりの
Maybe
部分は...
でマークされているようにApplicativeを評価された式は、型を取得していしよう
Couldn't match type ‘IO()’ with ‘()’
Expected type: ReaderT UDCEnv IO() -> UDCEnv ->()
Actual type: ReaderT UDCEnv IO() -> UDCEnv -> IO()
In the first argument of ‘(<$>)’, namely ‘runReaderT’
In the first argument of ‘(<*>)’, namely
‘runReaderT
<$>
(uploadVersionFilesToCaches s3BucketName <$> maybeFilePath
<*> Just gitRepoNamesAndVersions)’
/Users/blender/Code/Personal/Haskell/Rome-Public/src/Lib.hs: 82, 73
Couldn't match type ‘Maybe’ with ‘ExceptT String IO’
Expected type: ExceptT String IO FilePath
Actual type: Maybe FilePath
In the second argument of ‘(<$>)’, namely ‘maybeFilePath’
In the first argument of ‘(<*>)’, namely
‘uploadVersionFilesToCaches s3BucketName <$> maybeFilePath’
最初のエラーはどこかでliftIO
が不足していると思います。
しかし、私は誤解されたApplicativeについて何をすべきか分かりません。
Applicativeを使用する代わりに、おそらくMaybeを分析することができましたが、私は本当にそうしたくありません。
エラーから判断すると、「liftIO」ではなく「return」がありません。 – arrowd
@arrowdはうまくいくかもしれませんが、残念なことにここで私の適用上の問題に役立ちません。たぶん、これは正しいアプローチではないでしょうか? – tmpz
'runReaderT ...'式が実際に現れるコードを含めることができますか?おそらく、それは、Haskellが 'Maybe(IO)()'の代わりに 'ExceptT String IO()'とタイプしようとしているようなdo-blockで使われている可能性が高いです。 'Maybe'は' ExceptT String IO'ではなく、 '()'は 'IO()'ではないので、これは最終的に両方のエラーを説明します。これは、標準Maybe-to-ExceptTインターフェイスを追加するのと同じくらい簡単かもしれません。 –