2014-06-22 6 views
26

Mam ten kod i nie skompiluje, podświetlając x i y prawo od Point3 i pisania: "Wiele deklaracji x" i "Wiele deklaracji y". Co jest nie tak? Czy Point2 i Point3 nie mogą mieć tej samej nazwy?Wiele deklaracji x

data Point2  = Point2 {x :: Float, y :: Float} 
data Point3  = Point3 {x :: Float, y :: Float, z :: Float} 

Odpowiedz

38

Nie, to nie jest obecnie obsługiwane. Standardowe podejście polega na dodaniu do każdego pola czegoś unikatowego dla danego typu danych, np. p2x, p2y, p3x itp

Dlatego nie jest to obsługiwane, że każda płyta pole nazwy pośrednio tworzy funkcję „przełącznik”, np x :: Point2 -> Float. Posiadanie dwóch pól o tej samej nazwie w tym samym zasięgu spowoduje wygenerowanie konfliktu.

Jest to od dawna nie lada problem dla wielu osób i zostanie rozwiązany przez nadchodzące rozszerzenie językowe OverloadedRecordFields, które, miejmy nadzieję, będzie częścią GHC 7.12 (początek 2016 r.).

Po włączeniu to rozszerzenie zezwala na użycie tej samej nazwy pola w wielu rekordach. Selektor pól będzie miał typ przeciążony, który zostanie ogólnie rozwiązany przez wnioskowanie typu.

+2

Pity nie mamy rozwiązanie dla tego przypadku. – jiyinyiyong

+0

... ale jaki jest cel "DisambiguateRecordFields"? –

3

Rozszerzenie DuplicateRecordFields pozwala istniejącym rekordom Haskell na użycie zduplikowanych etykiet pól.

Zobacz DuplicateRecordFields

OverloadedRecordFields nie działa dla mnie z ghc-8.0.2

+0

Dzięki, myślę, że powinienem spojrzeć na notatki o wydaniu GHC. To była jedna z moich skargi nr 1! –