をお持ちの場合は、あなたがそのリストに保存されているアクションを実行していない
> let ls = [putChar 'x', putChar 'y']
、あなただけの場合は、それらのアクションを構築していますそれは理にかなっている。あなたは、ファイルに定義されて
printHelp :: IO()
printHelp = putStrLn "You need to pass XYZ options to this program"
のようなものを持つことができます。これはただちにメッセージを出力するのではなく、実行されるとそのメッセージをコンソールに出力するアクションを構築します。実行は、main
関数とGHCiの2つの場所のいずれかで行われます。
GHCiを使用してコードを実行しているようですが、これはさまざまな機能を調べるのに最適ですが、ファイル内でコードを実行するのとは少し異なります。 GHCiでIO Something
アクションを単独で評価するたびに、そのIOアクションが実行されます。 GHCiの他の値を評価するたびに、その行の前にprint
が挿入されます。あなたは
> head ls
を行うときにこれはIO()
型を持つ、などのアクションputChar 'x'
はx
がコンソールにプリントアウトされ、その結果、実行されます。あなたは
> tail ls
を行うとGHCiのは、その前に
print
を入れしようとするので、これは、入力した
> print (tail ls)
print
関数には等価で作り、[IO()]
を入力した
print :: (Show a) => a -> IO()
ここではprint
にリストを渡しました。リストの場合はShow
のインスタンスがありますが、l istのインスタンスはShow
です。したがって、コンパイラはIO()
にShow
のインスタンスがあるかどうかを確認しようとします。残念ながら、IO
はかなり複雑なタイプなので、何も起こり得ないことを表しています。コンパイラはIO()
にShow
のインスタンスがないというエラーを表示します。
リスト内のすべてのアクションを順番に実行する場合は、その機能があります:Control.Monad.sequence
(または結果を気にしない場合はControl.Monad.sequence_
)この関数は実際には、すべてのMonad
の上で動作していないだけでIO
:うまく
> sequence_ (tail ls)
y> sequence_ ls
xy>
'' GHCi'は 'IO'アクションを実行することを知っています - 次のケースで' IO'アクションのリスト( 'Show'のインスタンスではありません)が得られます - ' sequence_ $ tail ls'と似たものを取得する* – Carsten