Декартово произведение двух списков в F # с использованием рекурсии и вспомогательной функции - PullRequest
0 голосов
/ 21 октября 2018

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

let rec product A B =
    match A, B with
    | [], [] -> [ [] ]
    | e1::rest1, [] -> productHelp A B :: product rest1 B

let rec productHelp A B =
    match A, B with
    | [], [] -> [ [] ]
    | _, [] -> [ [] ]
    | e1::rest1, e2::rest2 -> [e1::e2]::productHelp A rest2


/home/codio/workspace/program/set/set.fs(144,24): error FS0039: The value or constructor 'productHelp' is not defined. Maybe you want one of the followi
ng:   product [/home/codio/workspace/program/set/set.fsproj]
    5 Warning(s)
    1 Error(s)

Пример:

// Example:
//   A = [1;2]
//   B = [3;4]
//   ==> [ [1;3]; [1;4]; [2;3]; [2;4] ]
// 

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Как насчет использования понимания ?

let product A B = [for a in A do for b in B -> [a; b]]
0 голосов
/ 21 октября 2018

В F # вы должны упорядочить свои объявления в файле, чтобы объявление ссылалось только на те, которые находятся над ним.То есть объявите помощника перед функцией продукта.

...