동기 부여가 Romans, rubies and the D인데, 나는 하스켈에서도 같은 결과가 나오는지 알고 싶었다.로마인, 루비와 하스켈
module Romans where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import Data.Text
num :: String -> String
num s = rep $ pack s
where
r1 s1 = replace (pack "IV") (pack "IIII") s1
r2 s2 = replace (pack "IX") (pack "VIIII") s2
r3 s3 = replace (pack "XL") (pack "XXXX") s3
r4 s4 = replace (pack "XC") (pack "LXXXX") s4
rep = unpack . r4 . r3 . r2 . r1
value :: String -> Int
value s = cnt $ pack s
where
c1 s1 = (count (pack "I") s1) * 1
c2 s2 = (count (pack "V") s2) * 5
c3 s3 = (count (pack "X") s3) * 10
c4 s4 = (count (pack "L") s4) * 50
c5 s5 = (count (pack "C") s5) * 100
cnt t = c5 t + c4 t + c3 t + c2 t + c1 t
roman :: String -> ExpQ
roman s = return $ LitE (IntegerL (compute s))
where
compute s = fromIntegral $ value $ num s
과 :
{-# LANGUAGE TemplateHaskell #-}
import Romans
main = print $ $(roman "CCLXXXI")
첫째,이 템플릿 하스켈에 새로운 오전, 나는 내가 바로 그것을 가지고 있는지 알고 싶습니다. 실제 계산은 컴파일 타임에 발생합니다. 맞습니까?
두 번째, 구문을 어떻게 개선합니까?
$(roman "CCLXXXI")
대신 roman "CCLXXXI"
또는 더 나은 것을 제안합니다. 지금까지 구문을 개선하지 못했습니다.
을, 돈 스튜어트 (멋진 [블로그 게시물을]이 http://donsbot.wordpress.com/2010 적절한 스위치가있는 LLVM 백엔드가 어떻게 템플릿 확장없이 하스켈 98 코드를 프리 컴파일할지 설명하는/03/01/evolving-faster-haskell-programs-now-with-llvm / –