2017-05-17 9 views

答えて

4

できません。 the definition of Shell *を参照してください。

newtype Shell a = Shell { _foldIO :: forall r . FoldM IO a r -> IO r } 

あなたはIO個のものしか入手できません。しかし、あなたはおそらくIO Textを得ることができます。シェルのものをやっているので、IOモナドのコンテキストがぶら下がっていると思われます。

FoldMが、我々はFoldM IO Line Textを構築することができれば、我々は我々が必要なものを得ることができるので、*

data FoldM m a b = 
    -- FoldM step initial extract 
    forall x . FoldM (x -> a -> m x) (m x) (x -> m b) 

として定義され、私は疑います。これは推測です(型チェックされていない、これは複雑になってきているので、おそらく間違いです)。

shellToText :: Shell Text -> IO Text 
shellToText shell = foldIO shell foldm 
    where 
    foldm :: FoldM IO Line Text 
    foldm = FoldM (\accum line -> return (accum <> lineToText line)) -- Text -> Line -> IO Text 
        (return Text.empty)        -- IO Text 
        return            -- Text -> IO Text 

これはおそらくかなりcombinators in Control.Foldlを使用することによって簡略化することができますが、私は運動としてそれを残しておきます。

(*)よく分からない場合は、最初のforallrank-2 typeを示し、2番目の数字はexistential typeを示します。救助へ

0

strict機能:

strict :: MonadIO io => Shell Line -> io Text

ので、あなたは

strict $ inshell "echo a line of text." empty

とはIOモナドのテキストでシェルコマンドの出力を得ることができます。

関連する問題