[Ur] Implicit problem in typeclass recursive instance [testable t] -> testable (list t)
Gabriel Riba
griba2001 at gmail.com
Mon Jan 19 08:05:45 EST 2015
Hi!
Here is the code:
(* --- *)
fun id [a] (x: a): a = x
type assertion = transaction xbody
datatype test = Test of assertion | TestList of (list test)
(* class *)
con testable t = {TestIt: t -> test}
fun mkTestable [t] (f: t -> test): testable t = {TestIt = f}
val testIt [t] (r: testable t): (t -> test) = r.TestIt
(* instances *)
val testable_test: testable test = mkTestable id
val testable_testList [t] (_: testable t): testable (list t) =
let
fun testIt' (t1: list t): test =
TestList (List.mp testIt t1) (* line with error *)
in mkTestable testIt'
end
(* --- *)
It looks like testIt in the error line does not get the implicit:
urweb prova_testable
/home/gabi64/lleng/ur/dlist/proves/prova_testable.ur:17:40: (to 17:42)
Unification failure
Expression: t1
Have con: list t
Need con: list {TestIt : <UNIF:K::Type> -> test}
Incompatible constructors
Have: t
Need: {TestIt : <UNIF:K::Type> -> test}
/home/gabi64/lleng/ur/dlist/proves/prova_testable.ur:17:24: (to 17:43)
Unification failure
Expression:
List.mp [{TestIt : <UNIF:K::Type> -> test}] [<UNIF:K::Type> -> test]
(testIt [<UNIF:K::Type>]) t1
Have con: list (<UNIF:K::Type> -> test)
Need con: list test
Incompatible constructors
Have: <UNIF:K::Type> -> test
Need: test
More information about the Ur
mailing list