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
을 두 번 인스턴스. 처음 마법처럼 간다 : 유형 검사는
(-->) :: Reference s a -> (n,a->b,a->b->a) -> Reference 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'')))
- 이제
Res a s b = Reference s b
이후 (>) I 두 번째 인스턴스를 추가하면 모든 것이 손상됩니다.
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
신중하게 컴파일러가이 유형 추론 것을 나에게 말하고 읽는 것을
컴파일러는 불평 (->)를 thusly 히 : 올바른
(-->) :: 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
이후
하지만 두 정의와 일치하지 않는 이유는 무엇입니까?
더 간결하고 독립 예제를 제공하지 않는,하지만이 경우에 당신이 당신이 말하는
instance Selectable a s b where
을 쓸 때 ... 그 방법
완전한 실행 가능한 예제를 제공 할 수 있습니까? 즉 '참조'는? 심지어'{- # LANGUAGE TypeFamilies # -}'를 포함합니다.다른 사람들이 당신을 도울 수 있도록 도와주는 이모. – yairchu
그것은 엄청 거대합니다. 이것은 단지 전체적으로 게시 할 수없는 훨씬 더 큰 프로젝트의 일각입니다. ( –