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