(inshell "echo A line of text." empty)
は、タイプがShell Line
であると考えてください。Haskell Turtle Libraryの `Shell Line`を` Text`に変換するには?
質問:このタイプの値をText
に変換するにはどうすればよいですか?
(inshell "echo A line of text." empty)
は、タイプがShell Line
であると考えてください。Haskell Turtle Libraryの `Shell Line`を` Text`に変換するには?
質問:このタイプの値をText
に変換するにはどうすればよいですか?
できません。 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
を使用することによって簡略化することができますが、私は運動としてそれを残しておきます。
(*)よく分からない場合は、最初のforall
はrank-2 typeを示し、2番目の数字はexistential typeを示します。救助へ
strict
機能:
strict :: MonadIO io => Shell Line -> io Text
ので、あなたは
strict $ inshell "echo a line of text." empty
とはIOモナドのテキストでシェルコマンドの出力を得ることができます。