[personal profile] gdsfh
Как некоторые знают, я некоторое время занимаюсь способами привнести немного runtime type information в окамловские строго- и статически- типизированные программы.
Репка -- https://bitbucket.org/gds/cadastr/src
Как один из примеров:

module List =
  ...
    class ti ['z]
    ?cmp ?eq ?hash ?show
    (ti_elem : #Cdt.ti 'b)
    () =
      object (self : #tifull (list 'a))

        constraint 'z = list 'a;

        inherit Cdt.ti ['z] ();

        method type_desc = ti_dispatch (
          let proc vnil vcons = Sum_type (fun ub ->
            match (uget_exn self ub) with
            [ [] -> ti_variant vnil [| |]
            | [h :: t] -> ti_variant vcons [| ubox ti_elem h ; ubox self t |]
            ])
          in fun
          [ "cmp" -> proc "List.0" "List.1"
          | _ -> proc "List.nil" "List.cons"
          ]
        )
        ;

        inherit tifull_ops [_] ?cmp ?eq ?hash
          ~show:
            (match show with
             [ None ->
                 fun lst ->
                   dump
                     ~begins:"[" ~ends:"]" ~delim:"; "
                     ti_elem
                     lst
             | Some show -> show
             ]
            )
          ()
        ;

      end
    ;
  ...


Тут мы определяем информацию о типе "список". Что же тут необычного:

1. не создаём никакого описания типа, наподобие [Nil | Cons of ..], вместо этого указываем просто "тип -- как бы sum type, который можно разрушить так-то", однако, на вход пойдёт именно list 'a, классический.

2. переопределяем сравнение так, чтобы, независимо от имён конструкторов (List.{nil,cons}), сравнение шло так, чтобы пустой список (nil) был всегда меньше cons-ячейки списка.

3. указываем, что, несмотря на имена конструкторов и sum type, список надо показывать в виде "[elem1; elem2; ...; elemN]", а не как нормальные sum types по умолчанию, "List.cons elem1 (List.cons elem2 List.nil)" (в случае, если пользователь new List.ti ti_elem не переопределил show так, как ему вздумается, через опциональный аргумент ?show:(list 'a -> string)).
From:
Anonymous( )Anonymous This account has disabled anonymous posting.
OpenID( )OpenID You can comment on this post while signed in with an account from many other sites, once you have confirmed your email address. Sign in using OpenID.
User
Account name:
Password:
If you don't have an account you can create one now.
Subject:
HTML doesn't work in the subject.

Message:

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org


 
Notice: This account is set to log the IP addresses of people who comment anonymously.
Links will be displayed as unclickable URLs to help prevent spam.

Profile

gdsfh

August 2013

S M T W T F S
    123
45678910
111213 14151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 23rd, 2017 02:35 pm
Powered by Dreamwidth Studios