[Ur] Implicit problem in typeclass recursive instance [testable t] -> testable (list t)
Adam Chlipala
adamc at csail.mit.edu
Thu Jan 22 10:52:46 EST 2015
It's not surprising that type-class resolution is not triggering
automatically in your code, because the keyword [class] doesn't appear
anywhere in the program! That is, you are not declaring any particular
type class as existing, and the [testable] argument to
[testable_testList] won't be marked as generated automatically.
Here's the idiomatic way to do it:
(* --- *)
fun id [a] (x: a): a = x
type assertion = transaction xbody
datatype test = Test of assertion | TestList of list test
(* class *)
structure Testable : sig
class testable
val mkTestable : t ::: Type -> (t -> test) -> testable t
val testIt : t ::: Type -> testable t -> t -> test
end = struct
type testable t = t -> test
fun mkTestable [t] (f : t -> test) = f
fun testIt [t] (f : testable t) = f
end
open Testable
(* 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)
in mkTestable testIt'
end
(* --- *)
On 01/19/2015 08:05 AM, Gabriel Riba wrote:
> (* --- *)
>
> 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
>
> (* --- *)
More information about the Ur
mailing list