Я работаю над некоторыми проблемами графов в Haskell. В середине своей работы я решил, что хочу иметь возможность представлять цвета ребер в типе данных графа. Итак, я начал с краев: края могли быть как окрашенными, так и неокрашенными. Вот краткий макет того, о чем я думал. Имейте в виду, я знаю, что в этом коде есть ужасные недостатки.
data BasicEdge v w = BasicEdge { b_endpoints :: (v,v), b_weight :: w}
data ColoredEdge v w c = ColoredEdge { c_endpoints :: (v,v), c_weight :: w, color :: c}
class Edge e where
endpoints :: e -> (v,v)
weight :: e -> w
instance Edge (BasicEdge v w) where
endpoints = b_endpoints
weight = b_weight
instance Edge (ColoredEdge v w c) where
endpoints = c_endpoints
weight = c_weight
Проблема 1: v и w в BasicEdge являются переменными другого типа, чем v и w в ColoredEdge. Таким образом, попытка получить к ним доступ полиморфным образом нелепа.
Проблема 2: возвращаемые значения в определении класса Edge являются переменными свободного типа, поэтому их нельзя сопоставлять с возвращаемыми значениями b_endpoints и c_endpoints и т. д.
Мне нужны переменные типа - вершины могут быть символами, строками, целыми числами и т. д. Веса ребер могут быть любыми числами (поплавки полезны для некоторых проблем). Цвета могут быть даже сконструированным типом данных.
Есть ли «идиоматический» способ сделать это на языке? Кажется, это базовый тип полиморфизма, но я изо всех сил пытаюсь понять, как его реализовать.
Заранее спасибо за вашу помощь, и, пожалуйста, поймите, что я провел последний день, пытаясь найти в Интернете руководство. Трудно структурировать поисковый запрос для этой проблемы.
v? - person AJF   schedule 18.05.2015IsListпакетаGHC.Exts, если хотите понять, что я имею в виду. - person AJF   schedule 18.05.2015