Как включить многострочный номер в исходный файл на Haskell? - PullRequest
4 голосов
/ 24 июня 2019

Я хотел бы вставить константу большого числа в мой код на Haskell, и для удобства чтения я хотел бы отформатировать его в несколько строк вместо одной строки.

Возможно ли это?

Ответы [ 2 ]

5 голосов
/ 24 июня 2019

Вы можете сделать квазиквотер.Возможно, вы даже захотите загрузить его в Hackage:

module X where

import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Data.Char

iQQ :: QuasiQuoter
iQQ = QuasiQuoter {
  quoteExp  = return . LitE . IntegerL . read . filter isDigit,

  quotePat  = \_ -> fail "illegal integer QuasiQuote \
                         \(allowed as expression only, used as a pattern)",
  quoteType = \_ -> fail "illegal integer QuasiQuote \
                         \(allowed as expression only, used as a type)",
  quoteDec  = \_ -> fail "illegal integer QuasiQuote \
                         \(allowed as expression only, used as a declaration)"
  }

И использовать:

{-# LANGUAGE QuasiQuotes #-}
import X

value = [iQQ|123
456|]

В результате:

Ok, two modules loaded.
*Main> value
123456

Или большее число:

value = [iQQ|
44444444444444444444444444444444444444444444444444444444444444444444444444444444
45555555555555555555555555555555555555555555555555555555555555555555555555555555
66666666666666666666666666666666666666666666666666666666666666666666666666666666
|]

А в GHCi:

Ok, two modules loaded.
*Main> value
444444444444444444444444444444444444444444444444444444444444444444444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555566666666666666666666666666666666666666666666666666666666666666666666666666666666
4 голосов
/ 24 июня 2019

Это возможный подход.Хотя я не совсем уверен в этом.Возможно, есть более простой способ.

largeConstant :: Integer
largeConstant = read $
  "12345" ++
  "12345" ++
  "12345"

В качестве альтернативы, мы могли бы использовать многострочные строковые литералы, даже если они не очень часто используются в Haskell.

largeConstant :: Integer
largeConstant = read
  "12345\
  \12345\
  \12345"

Включение CPP также являетсявариант, но кажется немного излишним.

largeConstant = 12345\
12345\
12345
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...