2012-05-08 2 views
4

문제 데이터 타입이있는 경우 :- safeCopy를 함수의

:

MyData = One Int | Two (Int -> Int) | Three | Four 

문제 제가

$(deriveSafeCopy 0 'base ''MyData) 

말할 때 다음 오류를 가지고 있다는 것이다

No instance for (SafeCopy (Int -> Int)) 
    arising from the use of `getSafePut` 
... 

그래서 SafeCopy가 기능을위한 것이 아닐 수도 있다는 것을 알고 있습니다 ...

문제가 있습니까? 이후 MyData의 모델을 변경할 수 없습니다 .... 어쩌면 이것을 할 수 있습니까?

답변

8

사실, SafeCopy의 점은 직렬화이므로 데이터에서 함수를 사용할 수 없습니다. GHC는 함수의 직렬화를 지원하지 않으며 다양한 이유에서 그렇게하는 것이 문제가됩니다. 함수는 운영 체제 핸들과 같은 일시적인 데이터를 닫을 수 있으므로 함수를 안정적으로 serialize 및 deserialize하는 것은 매우 어려울 수 있습니다.

다른 방법으로 모델링해야합니다. 예를 들어, Int -> Int 함수에서 필요한 몇 가지 동작 만 있으면 데이터 유형으로 모델링 할 수 있습니다. 당신이 필요로하는 유일한 기능이있는 경우 예를 들어, 및 \x -> x + 1 (임의의 상수 K에 대한) \x -> x `div` k, 당신은 쓸 수 :

data IntToInt 
    = DivideBy Int 
    | PlusOne 

것은 SafeCopy의 인스턴스가 될 수있다. 하지만 무제한적인 기능에 의존한다면보다 근본적인 방식으로 디자인을 변경해야 할 것입니다.

+0

답변 해 주셔서 감사합니다. 내가 사용할 수있는 몇 가지 가능한 기능이 있으므로 데이터 유형을 만들어야 할 것입니다. 어쨌든 저에게는 어쨌든 충격적입니다. 물론 이해가되지만 u.u. 다시 한 번 감사드립니다. – Illiax