2012-05-08 3 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 не поддерживает сериализацию функций, и было бы проблематично делать это по различным причинам; функции могут закрываться по эфемерным данным, таким как дескрипторы операционной системы и т. п., поэтому было бы очень сложно сериализовать и десериализовать функции надежно.

Вам придется моделировать его каким-либо другим способом; например, если в функции Int -> Int существует только несколько возможных вариантов поведения, вы можете моделировать их как тип данных. Например, если только функции, которые вам нужны \x -> x `div` k (для произвольной постоянной к) и \x -> x + 1, вы могли бы написать:

data IntToInt 
    = DivideBy Int 
    | PlusOne 

который может быть экземпляром SafeCopy. Но если вы полагаетесь на неограниченные функции, то, боюсь, вам придется изменить свой дизайн более фундаментальным образом.

+0

Спасибо за ответ! Есть несколько возможных функций, которые я использую, поэтому мне придется сделать их типом данных ... Это отчасти шокирует меня, это имеет смысл, конечно, но похоже единственное решение u.u. Еще раз спасибо – Illiax

 Смежные вопросы

  • Нет связанных вопросов^_^