Ocaml пользовательский тип сопоставления с шаблоном - PullRequest
0 голосов
/ 09 апреля 2019

Вот мое определение типа:

type ('type1, 'type2) symbol =
  | N of 'type1
  | T of 'type2

Вот несколько типов:

type mysub =| Abc | Bcd | Def

У меня также есть список [N Abc;N Bcd; T"("].

Что я хочу сделать - это выбросить все элементы типа T, а также выбросить 'type1 или 'type2. Таким образом, желаемый результат [Abc; Bcd]

Но когда я попробую этот кусок кода:

List.map (fun x-> match x with N (a)->a |T (b) ->b ) (List.filter (fun x->match x with
N (type1) ->true |T (type2) -> false) [N Abc;N Bcd; T"("]);;

это дает мне следующее сообщение:

Error: This expression has type (mysub, string) symbol list
       but an expression was expected of type
         (mysub, mysub) symbol list
       Type string is not compatible with type mysub.

Как я могу это исправить?

1 Ответ

0 голосов
/ 09 апреля 2019

В этом фрагменте

List.map
    (fun x -> match x with
    N a -> a
    T b -> b
    )

Типы возврата не совпадают для двух случаев совпадения. Если бы в списке были какие-либо элементы T b, то b была бы строкой, и компилятор не знает, что таких элементов нет. Поскольку вы знаете, что их нет, вы можете исправить это, указав в качестве результата для этого случая что-то отличное от b. Примерно так:

List.map
    (fun x -> match x with
    N a -> a
    T _ -> Abc
    )

Или даже это:

List.map
    (fun x -> match x with
    N a -> a
    T _ -> failwith "This can't happen"
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...