2016-04-24 14 views
3

Ich habe eine harte Zeit lesen die Typen in der Control.Lens.Wrapped-Modul und ich finde nicht viel anderes darüber geschrieben oder die newtype-Bibliothek, auf der es anscheinend basiert. Insbesondere frage ich mich, welche Art von Dingen ich tun kann, während ich im newtype Wrapper bleibe. Nehmen wir zum Beispiel an, ich habe zwei Listen, die sich in einem Data.Monoid.Sum Wrapper befinden. Gibt es eine Möglichkeit wie ich die ++ Listen leicht auflisten kann und einen neuen Wert noch in einem Sum Wrapper bekommen kann? Ich würde eine Funktion will, dass monomorph, etwa wie folgt aussieht:Verwendet von Wrapped typeclass in Control.Lens

canIdoThis :: ([a] -> [a] -> [a]) -> Sum [a] -> Sum [a] -> Sum [a] 

so, dass ich so etwas wie

canIdoThis (++) (Sum [1,2]) (Sum [3,4]) 

und Sum [1,2,3,4] erhalten tun könnte. (Natürlich wäre canIdoThis auch auf Product [a] arbeiten, etc.)

Alle anderen Tipps oder nur eine allgemeine aufzuschreiben aller Güte eines mit Control.Lens.Wrapped tun könnte, ist sehr geschätzt.

Antwort

2

Nutzt Wrapped nicht, aber:

import Data.Coercible 

canIdoThis :: ([a] -> [a] -> [a]) -> Sum [a] -> Sum [a] -> Sum [a] 
canIdoThis = coerce 

Sind Sie sicher, dass diese in Sum gewickelt werden sollte? No instance Num [a] standardmäßig.

+0

Verwenden Sie einfach 'Sum' als zufälliges Beispiel für einen' newtype' Wrapper mit 'Wrapped' Instanzen. Manchmal habe ich Sachen eingepackt und ich möchte operieren, was drin ist. –

+0

'coerce (++) (Sum [1,2,3]) (Summe [4,5,6]) :: Sum [Int]' funktioniert nicht in GHCi. –

+0

Es weiß nicht, dass das '[1,2,3]' auch '[Int]' ist, oder dass das (++) '[Int]' s verketten soll, im Gegensatz zu, sagen wir, '[ Summe Int] 's. 'coerce ((++) :: [Int] -> [Int] -> [Int]) (Summe [1,2,3] :: Summe [Int]) (Summe [4,5,6] :: Sum [Int]) :: Sum [Int] 'funktioniert. – Gurkenglas