あなたの問題は、リスト内包表記を使用してリスト内の要素を変更c='.'しようとしていることです。これは Haskell なので、何も変更する必要はありません。(まあ、STReforを除いてIORef、それは省きましょう)。
[if c == Nothing then "." else show (fromJust c) | c <- [Nothing, Just 3.... etc] ]
cトリックを行います: で置き換えることを指定する必要はありません"."。これは、リスト内包表記自体の使用によって既に暗示されています。ifそれをステートメントの出力値として指定するだけです。
( に置き換えたことに注意してください'.'。"."出力リストのすべての要素は同じ型でなければならないため、これはもちろん必要です。show (fromJust c)必ずtype を持っているため、 likeを同じリストにString入れることはできません。)Char'.'
しかし、Satvik と MathematicalOrchid で言及されている代替案の方が優れています。ifHaskell では、通常、関数のような標準ライブラリの高階関数を使用する代替手段がある場合は、明示的なステートメントなどを避けようとしmaybeます。明示的な決定を自分で書く場合はif、 のようによりもパターン マッチングを優先する必要があります。
[ case c of
Nothing -> "."
Just number -> show number
| c <- [Nothing, Just 3.... etc] ]