Template Haskell을 사용해야합니다. TH를 사용하면 컴파일 타임에 프로그래밍 방식으로 코드를 생성 할 수 있습니다. 이 경우 mymodulus는 실제로 "템플릿"입니다.
예를 들어 다음과 같이 프로그램을 다시 작성하여 함수를 정적으로 계산할 수 있습니다. 정적 테이블을 생성하는
{-# LANGUAGE TemplateHaskell #-}
import Table
mymodulus n = $(genmodulus 64)
main = mapM_ (print . mymodulus) [0..64]
그리고 코드 : 첫째, 평소와 같이, 대신 당신의 계수 함수를 호출의 주요 코드, 그것은 누구의 시체 컴파일시에 생성됩니다 스플 라이스는 함수를 호출
{-# LANGUAGE TemplateHaskell #-}
module Table where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
genmodulus :: Int -> Q Exp
genmodulus n = return $ CaseE (VarE (mkName "n"))
[ Match (LitP (IntegerL i))
(NormalB (LitE (IntegerL (i `mod` base))))
[]
| i <- [0..fromIntegral n] ]
where
base = 10
이것은 컴파일 타임에 생성되는 사례 표현의 추상 구문을 설명합니다.
genmodulus 64
======>
case n of {
0 -> 0
1 -> 1
2 -> 2
3 -> 3
4 -> 4
...
64 -> 4 }
-ddump-splices로 어떤 코드가 생성되는지 확인할 수 있습니다. 직접 스타일로 템플릿 코드를 작성했습니다. TH에 익숙한 사람은 패턴 코드를 더 간단하게 만들 수 있어야합니다.
또 다른 옵션은 값 테이블을 오프라인으로 생성하고 해당 데이터 구조 만 가져 오는 것입니다.
왜 그런지 말할 수 있습니다. 매우 복잡한 테이블 구동 함수가 있다고 가정합니다.
'[Integer -> Integer]'테이블이 있습니다. 기본적으로 값이 주어지면 해당 목록에서 해당 함수를 사용하여 만들어진 값의 새 목록을 생성합니다. 그 기능 목록을 자동으로 구성 할 수 있습니다. 테이블의 각 목록에는 여러 가지 기능이 포함될 수 있습니다. 기본적으로'mod' 연산에 기반하여 사용할 목록을 선택합니다.그러나 그것은 내가 컴파일 시간에 이미 그것을 만들 수 있다는 것을 의미합니다. – Egon