0

하스켈에서 사용자 정의 데이터 형식을 Poly a = X | Coef a | Sum (Poly a) (Poly a) | Prod (Poly a) (Poly a) deriving (Show)으로 사용하고 있습니다.하스켈에서 다항식을 표준 형식으로 변환

이와 같이 다항식 (3 + x)^2는 (Prod (Sum (Coef 3) X) (Sum (Coef 3) X))으로 표시됩니다.

이 방법으로 입력 된 다항식을 표준 형식의 계수 목록으로 변환하는 데 어려움을 겪고 있습니다. 이는 (3 + x)^2 = 9 + 6x + x^2와 같이 [9, 6, 1]이 될 것이라고 생각합니다.

가능한 해결책은 입력을 단순화 할 수 있도록 다항식 데이터 유형에 일부 수학 함수를 구현하는 것이지만 믿을 수는 없습니다. 다른 방법이 있습니까?

누군가 나를 올바른 방향으로 안내 할 수 있습니까?

+3

'폴리'유형으로 단순화하지 말고 계수 목록으로 직접 단순화하십시오. – Bergi

+0

나는 단순화 규칙을 만들려고 노력했지만 많은 것들이있어 모두 나열 할 수 없다. 그러나 한정된 금액이 있어야합니다. 그리고 때로는 새로운 규칙이 오래된 규칙을 어기는 경우가 있습니다. –

답변

6

Poly 유형을 단순화하지 말고 계수 목록을 직접 단순화하십시오. 또한 계수의 목록을 역전시킬 수도 있습니다 (^0의 첫 번째 요소, ^1의 두 번째 요소, ^2의 세 번째 요소 등). 더 쉽게 생각할 수 있습니다.

data Poly a = X | Coef a | Sum (Poly a) (Poly a) | Prod (Poly a) (Poly a) deriving (Show) 

toList :: Num a => Poly a -> [a] 
toList X = [0, 1] 
toList (Coef a) = [a] 
toList (Sum a b) = let a' = toList a … 
toList (Prod a b) = let a' = toList a … 

나는 연습으로 각각 SumProd의 목록 a'b'을 병합하는 방법의 실제 구현을 떠날거야.

원하는 경우 목록에서 표준 다항식 형식으로 변환하는 toPoly :: [a] -> Poly a 함수를 만들 수도 있습니다.

+0

정말 멋지 네요. 이것이 어디로 가는지를 이해한다면,'Sum'은'ZipList' 응용 프로그램을 사용하여 변환 될 것이고'Prod'는'['] 응용 프로그램을 사용하여 구현 될 것입니까? – 4castle

+3

@ 4castle'zipWith (+)'는 목록 길이가 같아야하기 때문에 충분하지 않습니다. 또한 [다항식 곱셈] (https://en.wikipedia.org/wiki/Polynomial_multiplication)은 중첩 목록보다 약간 복잡합니다. 두 개의 사용자 지정 재귀 도우미 함수가 필요하다고 생각합니다. – Bergi

+0

@Bergi 어떤 방향으로 나아갈 지 안내해 주셔서 감사합니다! 그래서 (패턴 합계)와 (패턴 ab) 패턴 행렬에리스트 a와리스트 b를 결합하는 올바른 방법을 찾거나, 외부에보다 재귀적인 코드가있을 경우,이 네 가지 패턴 일치로 계수 목록을 작성할 수 있습니다. 이 패턴 일치가 필요합니까? –