From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by yquem.inria.fr (Postfix) with ESMTP id 766E9BB84 for ; Mon, 8 Sep 2008 20:37:48 +0200 (CEST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArkCAHUNxUjQRG0ZiGdsb2JhbACBZZBgAQEBDyCjXYFk X-IronPort-AV: E=Sophos;i="4.32,359,1217800800"; d="p7s'?scan'208";a="16714205" Received: from unknown (HELO barracuda02.metaweb.com) ([208.68.109.25]) by mail3-smtp-sop.national.inria.fr with ESMTP; 08 Sep 2008 20:37:46 +0200 X-ASG-Debug-ID: 1220899057-6d0100390000-KLjvU0 X-Barracuda-URL: http://172.30.1.25:8000/cgi-bin/mark.cgi X-Barracuda-Connect: mail01.corp.sfo1.metaweb.com[172.30.62.126] X-Barracuda-Start-Time: 1220899057 Received: from h00215.dev.sfo1.metaweb.com (mail01.corp.sfo1.metaweb.com [172.30.62.126]) by barracuda02.metaweb.com (Spam Firewall) with ESMTP id B2C5E3EA03 for ; Mon, 8 Sep 2008 11:37:37 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by h00215.dev.sfo1.metaweb.com (Postfix) with ESMTP id 9B5A46C75D5 for ; Mon, 8 Sep 2008 14:37:37 -0400 (EDT) X-Virus-Scanned: amavisd-new at Received: from h00215.dev.sfo1.metaweb.com ([127.0.0.1]) by localhost (h00215.dev.sfo1.metaweb.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DMab9GJy+MQ7 for ; Mon, 8 Sep 2008 14:37:36 -0400 (EDT) Received: from timesink1.local (c-98-210-196-241.hsd1.ca.comcast.net [98.210.196.241]) by h00215.dev.sfo1.metaweb.com (Postfix) with ESMTP id 4B1AF6A5017 for ; Mon, 8 Sep 2008 14:37:36 -0400 (EDT) Message-Id: <0233247D-28D8-4C83-9EFB-6FD4B50B3D8B@metaweb.com> From: Warren Harris To: caml-list caml-list Content-Type: multipart/signed; boundary=Apple-Mail-2--73796428; micalg=sha1; protocol="application/pkcs7-signature" Mime-Version: 1.0 (Apple Message framework v926) X-ASG-Orig-Subj: killing a cat Subject: killing a cat Date: Mon, 8 Sep 2008 11:37:35 -0700 X-Mailer: Apple Mail (2.926) X-Barracuda-Virus-Scanned: by Barracuda Spam Firewall at metaweb.com X-Spam: no; 0.00; flowed:01 underscores:01 arises:01 dispatching:01 vastly:01 'int:01 unify:01 underscores:01 pkcs:01 warren:98 warren:98 desiring:98 psu:98 deo:98 dzx:98 --Apple-Mail-2--73796428 Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes Content-Transfer-Encoding: quoted-printable I've encountered a complicated issue that I'm wondering if anyone can =20= shed some light on here. It relates to polymorphic types what I like =20 to call Schr=F6dinger types (sorry, I don't know the real name for =20 these, but they're the dreaded polymorphic variables with underscores =20= that, like Schr=F6dinger's cat, are undefined until you use them for the = =20 first time). I'll try to distill it down to its simplest form here, =20 but the issue arises from desiring to implement something based on =20 "type-indexed values" such as described here: = http://citeseerx.ist.psu.edu/viewdoc/summary?doi=3D10.1.1.53.1977 In its simplest form, I have a writer type and a dispatching handler =20 like this: type ('a, 'b) writer =3D ((unit -> 'a) -> 'b) type ('a, 'b) handler =3D { handle : 'a -> (string -> 'a -> 'b, 'b) =20 writer } Then I wish to define a family of handlers that ultimately call the =20 writer's continuation. In the very simplest form, a handler might be =20 expressed as: let f =3D { handle =3D fun a k -> write_int_field "f" a k } which would have type "(int, 'a) handler" as desired. (In the real =20 implementation, there will be more than one handler, hence the need =20 for the record.) However, I wish to define a family of handlers that =20 all share common implementation, so I define a helper function (again, =20= vastly simplified): let helper name wf =3D { handle =3D fun a k -> wf name a k } let f =3D helper "f" write_int_field However, here the type of "f" is now "('int, '_a) handler" and fails =20 to unify with the desired type expressed in the interface. Now, I could get around this by making "f" be a function that when =20 evaluated returns the result of the helper. However, I'm trying to =20 avoid that because in the real implementation, the work of the helper =20= is somewhat expensive and should only be performed once. An alternate =20= solution can be achieved by pushing the universal qualifier for the =20 result type down into the handler: type 'a handler =3D { handle : 'b . 'a -> (string -> 'a -> 'b, 'b) =20 writer } However, this doesn't allow me to define the helper function as before: let helper name wf =3D { handle =3D fun a k -> wf name a k };; ^^^^^^^^^^^^^^^^^^^^^^ This field value has type 'a -> (string -> 'a -> 'b, 'b) writer which is less general than 'c. 'd -> (string -> 'd -> 'c, 'c) writer I am forced into reworking the helper parameter function, wf, to also =20= become a record in order for it to be universally qualified: type 'a field_handler =3D { write_field : 'b . string -> 'a -> (unit -> =20= string -> 'a -> 'b) -> 'b } This works: let helper name wf =3D { handle =3D fun a k -> wf.write_field name a k } let f =3D helper "f" write_int_field Here "f" has type "int handler" as desired, although this solution =20 seems somewhat round-about, and was difficult to arrive at. Can anyone =20= suggest another approach that prevents the dreaded underscores? (Note =20= that using objects instead of records exhibits the exact same behavior.) Warren Harris Metaweb Technologies --Apple-Mail-2--73796428 Content-Disposition: attachment; filename=smime.p7s Content-Type: application/pkcs7-signature; name=smime.p7s Content-Transfer-Encoding: base64 MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIKlzCCBREw ggP5oAMCAQICAQEwDQYJKoZIhvcNAQEEBQAwgb8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxp Zm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMSMwIQYDVQQKExpNZXRhd2ViIFRlY2hub2xv Z2llcywgSW5jLjEbMBkGA1UECxMSTWV0YXdlYiBPcGVyYXRpb25zMSEwHwYDVQQDExhNZXRhd2Vi IFJvb3QgQ2VydGlmaWNhdGUxHjAcBgkqhkiG9w0BCQEWD29wc0BtZXRhd2ViLmNvbTAeFw0wNjEw MTcxNjAyNTRaFw0xNjEwMTQxNjAyNTRaMIGrMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZv cm5pYTEjMCEGA1UEChMaTWV0YXdlYiBUZWNobm9sb2dpZXMsIEluYy4xGzAZBgNVBAsTEk1ldGF3 ZWIgT3BlcmF0aW9uczElMCMGA1UEAxMcTWV0YXdlYiBWUE4gUm9vdCBDZXJ0aWZpY2F0ZTEeMBwG CSqGSIb3DQEJARYPb3BzQG1ldGF3ZWIuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAus7rUEDLJAA7HelQnBvXWO06L3OUgyEfnj3ToI/Iop+LI513Y3/b3CHCR3bfIi3QzCPZUctt 7IOpT403qG1l3fI13n5fWoBNKXPP3jGs0ev2pDPclXK8SazndQNOVb0I6tdOj1osnARcX/Nj+zfm z7hAbDYzBba2VrfS/zHyVgxqhP/7B9etHva2UEX9ZxHk6prbP/hFc2Rp1PpyDRfaOdwSfVB9vxWE DX7BSfGO0oodK7YH1kk1CSZwjddXiemHUg6zztXJ4OohhhNsoWJ3gSqBG3RXWOpBRtqKZEkA1cS9 13hJ1qcG1XQHmyr8bY21x9oJT+qe6qLN0MCM6jkkdwIDAQABo4IBKDCCASQwHQYDVR0OBBYEFPEL NnHIEcBCuTE7rnw9YTnRs7g7MIH0BgNVHSMEgewwgemAFBLhBR58Q0Ibe+Q6UzvA0yk3eDeFoYHF pIHCMIG/MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy YW5jaXNjbzEjMCEGA1UEChMaTWV0YXdlYiBUZWNobm9sb2dpZXMsIEluYy4xGzAZBgNVBAsTEk1l dGF3ZWIgT3BlcmF0aW9uczEhMB8GA1UEAxMYTWV0YXdlYiBSb290IENlcnRpZmljYXRlMR4wHAYJ KoZIhvcNAQkBFg9vcHNAbWV0YXdlYi5jb22CCQDAK3meYNperzAMBgNVHRMEBTADAQH/MA0GCSqG SIb3DQEBBAUAA4IBAQAJ4X3ts+LJ16deo00h5nUA+IuVLR+h9BlzkQi6LCp5dZx97Ex2PaiQc4b2 G7kJA5OP/T68roWlj6LwoCTQmOZHK/W4xqm9Di9FqhvsigGeliFk5OIcTgot0GiVPoH4avCwa/mk 5uPj+RTAGTMxSjlUyNu4RzKD0WypKSP6ghc/55tosB/1WTbC8k/pV5EyL1FgF/3AnlG7O0uYFIYt OWmIMHm5XFLPHxjeUqDyEVeZm4STu8eWyo17ac+/JrPzd7zSnZGZd1nMXSSDuywRtCZEStq0SzkN oQbu6JGrL57TEL3HZdHPaIV5leYPyvGQMGplTiTAOIf+q+L5ro3+6FZaMIIFfjCCBGagAwIBAgIB VDANBgkqhkiG9w0BAQQFADCBqzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExIzAh BgNVBAoTGk1ldGF3ZWIgVGVjaG5vbG9naWVzLCBJbmMuMRswGQYDVQQLExJNZXRhd2ViIE9wZXJh dGlvbnMxJTAjBgNVBAMTHE1ldGF3ZWIgVlBOIFJvb3QgQ2VydGlmaWNhdGUxHjAcBgkqhkiG9w0B CQEWD29wc0BtZXRhd2ViLmNvbTAeFw0wODA0MTEyMTU3MzhaFw0xODA0MDkyMTU3MzhaMIGgMQsw CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEjMCEGA1UEChMaTWV0YXdlYiBUZWNobm9s b2dpZXMsIEluYy4xHDAaBgNVBAsTE01ldGF3ZWIgRW5naW5lZXJpbmcxFjAUBgNVBAMTDVdhcnJl biBIYXJyaXMxITAfBgkqhkiG9w0BCQEWEndhcnJlbkBtZXRhd2ViLmNvbTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAK0aYgN/4a6011jghtHtD4mt8FwE+fVakIiPYRRliLAVK54gIVJ3 Sw8LMlZli/TZcwThyD+d30k558k4R75Dkov5YarKPt0THlLDczqn4uw0L3hlrQKu0WWWCGHxf8kk 6w0LAxAgOqPsBSW8LhraOHQMANQ8MHlpuLg1bVdWG/G1WLs7A3uuhfpsImWeCrPjeEEnZ5O24aEx EwqFvrTtfLBYJBcK2u8Qb0HevjwXpeO71/4L9gPJGA3kPdDPbULAFbAr06Y9fTf6YLBPzMfKd1OP zIyjo75TjqCQ+GyV8Up1WXk9Vwa9s3t6qDINaCwTyO9DBwu9uS+gMfSkygn73F8CAwEAAaOCAbQw ggGwMAsGA1UdDwQEAwIF4DAdBgNVHQ4EFgQU6NZ6Tlb2wX+hA5ME3wLTneBEtI0wgewGA1UdIwSB 5DCB4YAU8Qs2ccgRwEK5MTuufD1hOdGzuDuhgcWkgcIwgb8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI EwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMSMwIQYDVQQKExpNZXRhd2ViIFRl Y2hub2xvZ2llcywgSW5jLjEbMBkGA1UECxMSTWV0YXdlYiBPcGVyYXRpb25zMSEwHwYDVQQDExhN ZXRhd2ViIFJvb3QgQ2VydGlmaWNhdGUxHjAcBgkqhkiG9w0BCQEWD29wc0BtZXRhd2ViLmNvbYIB ATAtBglghkgBhvhCAQQEIBYeaHR0cDovL3d3dy5tZXRhd2ViLmNvbS92cG4uY3JsMC8GA1UdHwQo MCYwJKAioCCGHmh0dHA6Ly93d3cubWV0YXdlYi5jb20vdnBuLmNybDAzBggrBgEFBQcBAQQnMCUw IwYIKwYBBQUHMAKGF2h0dHA6Ly93d3cubWV0YXdlYi5jb20vMA0GCSqGSIb3DQEBBAUAA4IBAQAs klPdQRHS1ZQimiVfDtDHr1gAmAGFj3mJhJbhg3eHnKd5vHlCGyoSzcR1ix/nWyx/7pcdXOoIrngi zVL18h1tRJKbTlfrtzJozEdUSEPmRLXqrzo5MdwyKnUZ7ZqT+FzmJhiyvBcX1vbGR1l0SCFLFO4w piuHIFWYmZcr4pq7UAXvmQKfjKFJhoAmTYEUW7BlJDGLIN5skai6XOAyWHzOugLwKkaEPn5p+sMf JL75PE3f84Ipf8AEmvdUCEXz9znn0YxDfypzHblFXEUKtAeGhY854bzxga6n1hJHOSzRhF/PfUOI MbatQSJ+SyDDkmW5wPIGckbFd0HZFSEsqrw3MYIDxjCCA8ICAQEwgbEwgasxCzAJBgNVBAYTAlVT MRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQKExpNZXRhd2ViIFRlY2hub2xvZ2llcywgSW5j LjEbMBkGA1UECxMSTWV0YXdlYiBPcGVyYXRpb25zMSUwIwYDVQQDExxNZXRhd2ViIFZQTiBSb290 IENlcnRpZmljYXRlMR4wHAYJKoZIhvcNAQkBFg9vcHNAbWV0YXdlYi5jb20CAVQwCQYFKw4DAhoF AKCCAekwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMDgwOTA4MTgz NzM2WjAjBgkqhkiG9w0BCQQxFgQU8tuanyuC6UfuWnhYdYiPfmiIx2YwgcIGCSsGAQQBgjcQBDGB tDCBsTCBqzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExIzAhBgNVBAoTGk1ldGF3 ZWIgVGVjaG5vbG9naWVzLCBJbmMuMRswGQYDVQQLExJNZXRhd2ViIE9wZXJhdGlvbnMxJTAjBgNV BAMTHE1ldGF3ZWIgVlBOIFJvb3QgQ2VydGlmaWNhdGUxHjAcBgkqhkiG9w0BCQEWD29wc0BtZXRh d2ViLmNvbQIBVDCBxAYLKoZIhvcNAQkQAgsxgbSggbEwgasxCzAJBgNVBAYTAlVTMRMwEQYDVQQI EwpDYWxpZm9ybmlhMSMwIQYDVQQKExpNZXRhd2ViIFRlY2hub2xvZ2llcywgSW5jLjEbMBkGA1UE CxMSTWV0YXdlYiBPcGVyYXRpb25zMSUwIwYDVQQDExxNZXRhd2ViIFZQTiBSb290IENlcnRpZmlj YXRlMR4wHAYJKoZIhvcNAQkBFg9vcHNAbWV0YXdlYi5jb20CAVQwDQYJKoZIhvcNAQEBBQAEggEA FRXB8B7qBdZIavuA2MTjCaM2HIUsoQV7I+aU35y3x7ZkBF7uBLlebWR0bAjwfOXqNy2GyRVS+gp3 IAYoRQpLOArRUVJpfQ7Nx2pQ7d59wLgAZwrA078J2amP9e55pxQBZrcXrGsbA6puGwGc/5Ty5hRW 5q8y+OYE6T0O1CgSE6p4MG94U9PDTz0aZHNM8n6hJXmIRElckkCV14lyySH0Czj3YTamRmSh+2Xq R/UsFZQS06ErHJc0Q4f+eMT5dC6r8hb39E7kMHCoWiWpQ0cjGzIcP34hdwfGB9tVaEoIkY/uirTW jDOip3uwFSb775s5jvGAhvS82sHy1e2MmjJ9IgAAAAAAAA== --Apple-Mail-2--73796428--