Можно ли использовать расширение CPP для кода Haskell, которое содержит многострочные литералы? Существуют ли другие методы условной компиляции для Haskell?
Например, возьмите этот код:
-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}
msg = "Hello\
\ Wor\
\ld!"
main = putStrLn msg
Если я раскомментирую {-# LANGUAGE CPP #-}
, то GHC опровергает этот код с помощью лексической ошибки:
[1 of 1] Compiling Main ( cpp-multiline.hs, cpp-multiline.o )
cpp-multiline.hs:4:17:
lexical error in string/character literal at character 'o'
Используя GHC 6.12.1, доступны cpphs.
Я подтверждаю, что использование опции cpphs.compat и -pgmP cpphs.compat
помогает, но я хотел бы иметь решение, которое не зависит на пользовательских сценариях оболочки. -pgmP cpphs
не работает.
P.S. Мне нужно использовать другой код для GHC < 6.12 и GHC >= 6.12, возможно ли без препроцессора?
UPD. В дополнение к принятому ответу Ганеша, я также обнаружил, что другим обходным путем является размещение всех условных объявлений в отдельном модуле с помощью {-# LANGUAGE CPP #-}
и, таким образом, исключение CPP в модулях с многострочными строками.