Saya butuh bantuan dalam mencari kesalahan kompiler yang benar-benar membuat saya gila...
Saya memiliki kelas tipe berikut:
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
yang saya contohkan dua kali. Pertama kali berjalan seperti pesona:
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'')))
sejak pemeriksa tipe menyimpulkan
(-->) :: Reference s a -> (n,a->b,a->b->a) -> Reference s b
dan tanda tangan ini cocok dengan tanda tangan kelas untuk (-->) sejak itu
Res a s b = Reference s b
Sekarang saya menambahkan contoh kedua dan semuanya rusak:
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
kompiler mengeluhkan hal itu
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
membaca dengan cermat kompiler memberi tahu saya bahwa ia telah menyimpulkan tipe (-->) sebagai berikut:
(-->) :: Reference s a -> (n,a->(Method reca b c),a->(Method reca b c)->a) -> (b -> Reference s c)
yang benar sejak itu
Res a s (Method reca b c) = b -> Reference s c
tapi kenapa tidak bisa cocok dengan kedua definisi tersebut?
Maaf karena tidak menawarkan contoh yang lebih ringkas dan mandiri, tetapi dalam kasus ini saya tidak tahu bagaimana melakukannya...
Reference
berasal? dan bahkan menyertakan{-# LANGUAGE TypeFamilies #-}
. imho itu bisa membantu orang lain membantu Anda. - person yairchu   schedule 08.04.2010