2016-03-11 2 views
0

У меня есть тип данных:Как создать Складной экземпляр типа с несколькими параметрами в Haskell?

data Box a b = Box a b 

Я хочу, чтобы создать экземпляр FoldableBox и так как экземпляр Foldable должно быть дано что-то роде * -> *, я объявлю экземпляр как:

instance Foldable (Box a) where 
    foldr f x (Box r s) = undefined 

Теперь я могу делать только что-то вроде:

foldr f x (Box r s) = f s x 

в definiti на из foldr но что, если вместо того, чтобы работать на s, я хочу, чтобы что-то вроде:

foldr f x (Box r s) = f r x 

компилятор не позволяет мне сделать это так, что это правильный способ пойти об этом?

+0

@chi упс - спасибо ... к сожалению, это поздно, чтобы изменить вещи, и я не знаю, если это стоит того ... поэтому я думаю, что я удалю его – Carsten

+1

Правильный способ? Некоторые варианты. 1. Не используйте 'Foldable', потому что вы хотите что-то семантически другое. 2. Сделайте «тип B a = бокс a a; экземпляр Складной B, где затем складываются оба элемента. 3. Сделайте экземпляр для оболочки newtype 'newtype FlipBox a b = FBox (Box b a); instance Foldable (FlipBox a) где ... '. –

+0

@ThomasMDuBuisson, вы не можете сделать синоним типа экземпляром класса. – dfeuer

ответ

0

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

Предположения о Newtype newtype Flip t a b = Flip {unFlip :: (t b a)} с соответствующей инстанцией, определенной является наиболее стандартным способом обойти эту проблему, и теперь вы можете написать складку на Flip Box, а не на Box.

0

Вы должны объявить экземпляр, как: например, складная коробка, где ... (Box а) :: *

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