AMcoder - javascript, python, java, html, php, sql

Ocaml առաջին կարգի մոդուլ և ընդլայնված տարբերակ

Ես փորձեցի օգտագործել առաջին կարգի մոդուլը` ներդնելով կոդի այս հատվածը.

module Component =
  struct

    type t_data = ..

    module type S =
      sig
        type t
        val create : t -> t_data
      end

    module Make (C: sig type t end) =
      struct
        type t = C.t
        type t_data += T of C.t
        let create data = T data
      end

  end

let create m data =
  let module M = (val m : Component.S) in M.create data

(*  The type constructor M.t would escape its scope *)

Ես նույնպես կփորձեի այս այլընտրանքը, բայց չգիտեմ, թե ինչպես ավելացնել ընդլայնված t_data տիպը S մոդուլում:

let create' m data =
  let module M = (val m : Component.S) in M.T data
(* Unbound constructor M.T *)

Ես օգտագործում եմ bucklescript, շնորհակալություն:


Պատասխանները:


1

Ձեզ պարզապես անհրաժեշտ են մի քանի լրացուցիչ ծանոթագրություններ՝ մեքենագրողին համոզելու համար.

let create (type t0) (m : (module Component.S with type t = t0)) data =
  let module M = (val m) in M.create data

Որը կարելի է կրճատել հետևյալի.

let create (type t0) (module M : Component.S with type t = t0) data =
  M.create data

(type t) ծանոթագրությունը ներկայացնում է տեղական վերացական տվյալների տեսակը: Ֆունկցիայից դուրս այս տեսակը վերածվում է ունիվերսալ տիպի փոփոխականի, այդպիսով տրված է տեսակը.

val create : (module Component.S with type t = 'a) -> 'a -> Component.t_data

Դուք կարող եք օգտագործել տեղական վերացական տեսակը, ինչպես ցանկացած այլ տեսակ, մասնավորապես, կարող եք տեղադրել այն նաև տեղական սահմանված մոդուլներում.

let inject (type t0) data =
  let module M0 = struct type t = t0 end in
  let module M = Component.Make(M0) in
  M.create data
val make : 'a -> Component.t_data
07.05.2018
  • Նաև գիտե՞ք, թե ինչ է նշանակում, որ M.t-ը դուրս կգա իր շրջանակներից: Այն, ինչ ես հասկանում եմ, այն է, որ տառաչափը ստուգում է միայն Component.S-ը (և արգումենտը m-ը գործընթացի մաս չէ), որը պարունակում է վերացական տեսակ, որը սպասում է սահմանման զանգահարողի կողմից: 07.05.2018
  • Դա քիչ թե շատ նշանակում է, որ ձեր ֆունկցիան կվերադարձնի մի տեսակ, որի համար արտաքին միջավայրը անուն չունի: Այստեղ M.t-ը դրսում անուն չունի, քանի որ այն թաքնված է m արժեքի ներսում: Այս դեպքում դա քիչ թե շատ անավարտ տեսակի եզրակացության արտեֆակտ է. փոխարենը վերջնական տեսակն անցնում է տիպի փոփոխականով: 07.05.2018
  • Հասկանալի է մեծ մասամբ, բավականին մեծ գազան է ընտելացնել: Շնորհակալություն սենսեյ 07.05.2018
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..