[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