ฉันต้องการความช่วยเหลือในการหาข้อผิดพลาดของคอมไพเลอร์ซึ่งทำให้ฉันแทบบ้า...
ฉันมีคลาสประเภทต่อไปนี้:
infixl 7 -->
class Selectable a s b where
type Res a s b :: *
(-->) :: (CNum n) => (Reference s a) -> (n,(a->b),(a->b->a)) -> Res a s b
ซึ่งฉันยกตัวอย่างสองครั้ง ครั้งแรกเป็นเหมือนเสน่ห์:
instance Selectable a s b where
type Res a s b = Reference s b
(-->) (Reference get set) (_,read,write) =
(Reference (\s ->
let (v,s') = get s
in (read v,s'))
(\s -> \x ->
let (v,s') = get s
v' = write v x
(_,s'') = set s' v'
in (x,s'')))
เนื่องจากตัวตรวจสอบประเภทอนุมาน
(-->) :: Reference s a -> (n,a->b,a->b->a) -> Reference s b
และลายเซ็นนี้ตรงกับลายเซ็นของคลาสสำหรับ (-->) ตั้งแต่นั้นมา
Res a s b = Reference s b
ตอนนี้ฉันเพิ่มอินสแตนซ์ที่สองและทุกอย่างพัง:
instance (Recursive a, Rec a ~ reca) => Selectable a s (Method reca b c) where
type Res a s (Method reca b c) = b -> Reference s c
(-->) (Reference get set) (_,read,write) =
\(x :: b) ->
from_constant( Constant(\(s :: s)->
let (v,s') = get s :: (a,s)
m = read v
ry = m x :: Reference (reca) c
(y,v') = getter ry (cons v) :: (c,reca)
v'' = elim v'
(_,s'') = set s' v''
in (y,s''))) :: Reference s c
คอมไพเลอร์บ่นว่า
Couldn't match expected type `Res a s (Method reca b c)'
against inferred type `b -> Reference s c'
The lambda expression `\ (x :: b) -> ...' has one argument,
which does not match its type
In the expression:
\ (x :: b)
-> from_constant (Constant (\ (s :: s) -> let ... in ...)) ::
Reference s c
In the definition of `-->':
--> (Reference get set) (_, read, write)
= \ (x :: b)
-> from_constant (Constant (\ (s :: s) -> ...)) :: Reference s c
เมื่ออ่านอย่างละเอียดคอมไพเลอร์กำลังบอกฉันว่ามันได้อนุมานประเภทของ (-->) ดังนี้:
(-->) :: Reference s a -> (n,a->(Method reca b c),a->(Method reca b c)->a) -> (b -> Reference s c)
ซึ่งถูกต้องตั้งแต่นั้นเป็นต้นมา
Res a s (Method reca b c) = b -> Reference s c
แต่ทำไมมันไม่ตรงกับสองคำจำกัดความนี้ล่ะ?
ขออภัยที่ไม่ได้เสนอตัวอย่างที่กระชับและสแตนด์อโลนมากกว่านี้ แต่ในกรณีนี้ ฉันไม่สามารถทราบได้ว่าจะทำอย่างไร...
Reference
มาจากไหน? และรวมถึง{-# LANGUAGE TypeFamilies #-}
ด้วย imho ที่สามารถช่วยผู้อื่นช่วยคุณได้ - person yairchu   schedule 08.04.2010