Создание кортежа из двух списков двух разных типов - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь создать список кортежей из двух разных списков, где каждая голова из двух списков станет кортежем (например, headList1 и headList2 станет кортежем), и это продолжается для каждого элемента), и я получать ошибки типа в F #, и я не уверен, что я делаю неправильно. Я пытался убрать скобки, вставив фигурные скобки и т.д., но все еще безрезультатно.

let rec pairToTuple letter count = // assume that each list is the same, will return a list with (letter, count) in itself
  match letter with
  | [] -> [()]
  | e1::rest1, e2::rest2 -> let tup = (e1, e2) 
                            tup::(pairToTuple rest1 rest2 )

например: (a, b, c) и (10, 20, 30) станут [(a, 10); (b, 20); (c, 30)]

/home/codio/workspace/program/Program.fs(180,5): error FS0001: This expression was expected to have type    ''a list'    but here has type    ''b * 'c'
[/home/codio/workspace/program/program.fsproj]

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

А как насчет функции List.zip?

> List.zip ["a"; "b"; "c"; "d"] [1; 2; 3; 4];;
val it : (string * int) list = [("a", 1); ("b", 2); ("c", 3); ("d", 4)]
0 голосов
/ 06 ноября 2018

Вы можете просто использовать функцию List.map2 :

let pairToTuple letterList countList =
    List.map2 (fun letter count -> (letter, count)) letterList countList

Или вы можете написать его короче на идиомах F #:

let pairToTuple = List.map2 (fun letter count -> (letter, count))

Если ваш вопрос - упражнение, и вы не хотите использовать List.map2, тогда:

let rec pairToTuple letterList countList =
    match letterList, countList with
    | [], _ -> []
    | _, [] -> []
    | letter :: res1, count :: res2 ->
        (letter, count) :: pairToTuple res1 res2
...