Ocaml: совпадение по одному предмету в паре - PullRequest
4 голосов
/ 06 мая 2011

У меня есть функция, которая принимает темп, который является парой.

type temp = (pd * string);;

Я хочу извлечь эту строку в temp. Но я не могу написать функцию, которая может просто соответствовать по времени, поскольку это тип.

Я написал функцию:

let print_temp(t:temp) (out: out_channel) : unit = 
    fun z -> match z with 
            (_,a) -> output_string out a "
;;

Но это дает мне ошибку, говоря, что это не функция. Я в основном хочу извлечь эту строку и распечатать ее. Любой вклад в это будет приветствоваться.

Ответы [ 2 ]

7 голосов
/ 06 мая 2011

Ваше решение почти правильное - вам не нужна часть "fun z ->", и похоже, что у вас может быть постороннее ". Вместо этого вам нужно сопоставить образец с t, как это:

let print_temp (t:temp) (out:out_channel) : unit =
  match t with
    (_,a) -> output_string out a

Вы также можете сделать это более кратко путем сопоставления с образцом в определении функции:

let print_temp ((_,a):temp) (out:out_channel) : unit = output_string out a

В вашем коде ошибка типа, которую вы получаете, говорит вам, что вы объявили print_temp, чтобы вернуть единицу, но на самом деле вернули функцию (забавно z -> ...). Обратите внимание, что, поскольку t: temp - это то, что вы хотите «разобрать», имеет смысл, что вы будете использовать шаблонное сопоставление.

0 голосов
/ 04 мая 2012

вместо

match t with (_, a) -> output_string out a

вы можете также использовать функции fst snd )

let a = fst t in output_string out a

или даже более краткий

output_string out (fst t)
...