Haskellでどう見ても文法的に間違っていないのに、
何故かコンパイルエラーになっていましたが、
改行コードが原因でした。

ちょうど始めたばかりで、実は文法ミスや、
バージョン違いとの切り分けが大変でしたが、
結果は残念な結果になりました…

まとめ

  • GHCではLF、CRLFは正しく動くがCRはダメ
  • PDFからサンプルコードをコピペしたらCRになっていた
    • Macのプレビューでいくつか試したが、現状全てCRになる
    • PDFが原因か、Preview.appがそういう仕様なのかは用検証

調査方法

以下のファイルを改行コードLFで保存します。

lf.hs

plus :: Integer -> Integer -> Integer
plus a b = a + b

main = print (plus 40 2)

LFのまま実行します

file lf.hs
# lf.hs: ASCII text
runghc lf.hs
# 42

CRLFに変換して実行します

nkf -Lw lf.hs > crlf.hs
file crlf.hs
# crlf.hs: ASCII text, with CRLF line terminators
runghc crlf.hs
42

CRに変換して実行します

nkf -Lm lf.hs > cr.hs
file cr.hs
# cr.hs: ASCII text, with CR line terminators
runghc cr.hs
# cr.hs:1:62: parse error on input ‘=’

失敗しますね(´・_・`)

何故CRが紛れ込んだか

最近のmacは改行コードがLFですし、CRが混入するのは中々ありません。

今回は、ちょうどサンプルに使っているPDFからコードをコピペしたところ、
改行コードがCRになっていたのが原因でした。

いくつかのPDFでやってみましたが、全てCRになっており、
Preview.appで必ずCRにされるのか、PDF自体がCRなのかは切り分けが必要です。

このエントリーをはてなブックマークに追加