>>963
(fst $) の型は (a, b) -> a だ。
これは、(fst $) は (a, b) 型の値に適用して a 型の値を返す、という意味だ。

あなたのプログラムでは、(fst $) を runWriter に適用している。

では、runWriter の型は (a, b) なのか?

違うよね。
runWriter の型は Writer x y -> (y, x) だ。

(fst $) は (a, b) 型の値に適用することが期待されているのに、
実際のプログラムソースでは (Writer x y -> (y, x)) 型の値に適用しようとしている。
マッチしないよ。

というのがエラーの内容だ。


で、あなたがやりたいことが getValue の型の通りだとするなら、
そこは fst $ runWriter ではなく fst . runWriter なのでは?