Functor jako pole w strukturze, czy da się to zrobić lepiej w Haskellu?

1

Cześć, chciałbym mieć w Haskellu Functor jako typ pola w strukturze (lub ogólnie dowolną Type Classę jako typ pola). W tej chwili robię coś takiego:

data MyStruct f = MyStruct Int f -- chciałbym żeby f był typu Functor Int

-- Wiem że można użyć rekordów i miałbym ten getter za darmo, ale nie chcę komplikować przykładu
functorFromMyStruct :: Functor f => MyStruct (f Int) -> f Int
functorFromMyStruct (MyStruct i f) = f

-- Funkcja która przetwarza mój typ danych
doStaff :: Functor f => MyStruct (f Int) -> MyStruct (f Int)
doStaff (MyStruct i f) = MyStruct i (fmap (\a -> a + i) f)

-- Wywołanie
main = putStrLn $ show $ functorFromMyStruct $ doStaff (MyStruct 11 [1, 2, 3])

Rezultat:

[12,13,14]

Czy da się to zrobić lepiej? Interesują mnie dowolne rozszeżenia kompilatora. I tak mam już włączonych ich multum

Przyjmę też rozwiązanie w PureScripcie, Idrisie czy Ruscie

0

Jeśli chcesz przenieść pomysły z C do Haskella to coś poszło nie tak.

1
vpiotr napisał(a):

Jeśli chcesz przenieść pomysły z C do Haskella to coś poszło nie tak.

To pewne :D Tak jak to że nie umiem dobrze pisać w Haskellu :P Dlatego pytam się czy to dobra idea, czy zła idea. Czy ten kod jest napisany dobrze czy źle

1 użytkowników online, w tym zalogowanych: 0, gości: 1