우리는 수정 된 2 차원 문법 구문에 기초하여 행렬 압축 라이브러리를 구현하고 있습니다. 이제 데이터 유형에 대한 두 가지 접근 방식이 있습니다. 메모리 사용시 어떤 것이 더 좋을까요? (우리는 무언가를 압축하고 싶다).
문법에는 정확히 4 개의 프로덕션이있는 비 터미널 또는 오른쪽에 터미널이 포함되어 있습니다. 평등 확인 및 문법 최소화를 위해서는 프로덕션 이름이 필요합니다.
첫번째:
-- | Type synonym for non-terminal symbols
type NonTerminal = String
-- | Data type for the right hand side of a production
data RightHandSide = DownStep NonTerminal NonTerminal NonTerminal NonTerminal | Terminal Int
-- | Data type for a set of productions
type ProductionMap = Map NonTerminal RightHandSide
data MatrixGrammar = MatrixGrammar {
-- the start symbol
startSymbol :: NonTerminal,
-- productions
productions :: ProductionMap
}
여기서 RightHandSide 데이터는 다음 프로덕션을 결정하기 위해 문자열 이름 만 저장하며 여기서 알 수없는 것은 Haskell이 이러한 문자열을 저장하는 방법입니다. 예를 들어 [[0, 0], [0, 0]] 행렬에는 2 개의 생성이 있습니다.
a = Terminal 0
aString = "A"
b = DownStep aString aString aString aString
bString = "B"
productions = Map.FromList [(aString, a), (bString, b)]
그래서 여기서 질문은 얼마나 자주 문자열 "A"가 저장됩니까? aString에서 한 번, b에서 4 번, 프로덕션에서 한 번 또는 aString에서 한 번만 다른 사람들이 "저렴한"참조를 보유하고 있습니까?
두번째:
data Production = NonTerminal String Production Production Production Production
| Terminal String Int
type ProductionMap = Map String Production
여기서 "터미널"이라는 용어는 실제로 터미널이 오른쪽 인 생산이기 때문에 약간 오해의 소지가 있습니다. 동일한 매트릭스 :
a = Terminal "A" 0
b = NonTerminal "B" a a a a
productions = Map.fromList [("A", a), ("B", b)]
비슷한 질문 : Haskell이 내부적으로 얼마나 자주 생산을 저장합니까? 아마도 우리가 필요하지 않은 경우 프로덕션 내부에 이름을 드롭 할 것입니다. 그러나 지금은 확실하지 않습니다.
약 1000 개의 작품이있는 문법이 있다고합시다. 어느 방법이 메모리를 덜 소비합니까?
마지막으로 Haskell의 정수에 대한 질문 : 현재 우리는 이름을 문자열로 사용할 계획입니다. 그러나 우리는 1000 개의 프로덕션으로 4 자 이상의 이름을 가질 것이기 때문에 정수 이름으로 쉽게 전환 할 수 있습니다 (32 비트라고 가정 함). Haskell은이를 어떻게 처리합니까? Int는 항상 32 비트이며 Integer는 실제로 필요한 메모리를 할당합니까?
나는 또한 이것을 읽었습니다 : Haskell의 값 / 참조 의미론의 테스트 개발 -그러나 그것이 우리에게 정확히 무엇을 의미하는지 알 수 없습니다-나는 명령형 자바 아이보다 좋은 기능성 프로그래머입니다 : P