実行時にエラーが出る次のプログラムのコンパイルが通ってしまうのはどうしてでしょうか
以下のHaskellコードはGHCで問題なくコンパイルされます。
f :: String -> MaybeT IO String
f x =
MaybeT $ do
s <- getLine
case s of
"y" ->
pure . pure =<< getLine
_ ->
empty
実行するとempty
のケースのときエラーになってしまいます。
> runMaybeT $ f "a"
b
*** Exception: user error (mzero)
empty
のケースの型が間違っているので、そこを修正すれば動作します。
f :: String -> MaybeT IO String
f x =
MaybeT $ do
s <- getLine
case s of
"y" ->
pure . pure =<< getLine
_ ->
pure empty
期待どおりになります。
> runMaybeT $ f "a"
b
Nothing
最初のコードを型エラーとしてコンパイル時にはじいてほしいのですが、どうして型チェックをすりぬけてしまうのでしょうか。
GHCに与えるオプションの調整が必要でしょうか。-Wall
は付けています。
環境は以下です。
uname -v
Darwin Kernel Version 14.3.0: Mon Mar 23 11:59:05 PDT 2015; root:xnu-2782.20.48~5/RELEASE_X86_64
ghc -V
The Glorious Glasgow Haskell Compilation System, version 7.10.1
追記: import
しているモジュールの定義による影響であるという指摘がありましたので、どれが該当するのか調べました
LibZip-0.11.1パッケージの
import Codec.Archive.LibZip
または ListLike-4.2.0パッケージの
import System.Process.ListLike
のいづれかの行を追加したときにコンパイルエラーにならず、実行時エラーになりました。
どちらもimportしなければ、期待どおりコンパイルエラーになります。
どちらでも発生するので、このモジュールそのものではなく、内部でimportしている別のモジュールが影響しているのだろうと思いましたが、それがどれなのかまでは僕のスキルでは特定できませんでした。