Функция отображения Haskell с оператором where в F # - PullRequest
1 голос
/ 18 декабря 2009

Я пытаюсь перенести эту функцию haskell на F #

subs        ::  [a] -> [[a]]
subs []     =   [[]]
subs (x:xs) =   ys ++ map (x:) ys
                where 
                   ys = subs xs

пример

сабс [1,2,3]

возвращается:

[[], [3], [2], [2,3], [1], [1,3], [1,2], [1,2,3]]

возвращает все подпоследовательности списка, которые задаются всеми возможными комбинациями исключения или включения каждого элемента

....

У меня проблемы с оператором 'where', который рекурсивно генерирует другой список 'ys'.

Я также не уверен, что правильно перенести предикат '(x :)' на '(fun i -> i)'.

Это как раз то утверждение F #, которое я могу понять.

let rec subs list =
    match list with
        | [] -> [[]]
        | x::xs -> List.map (fun i -> i) xs

Любая помощь или направление будет принята с благодарностью.

Ответы [ 2 ]

7 голосов
/ 18 декабря 2009

Вот F #:

let rec subs list =    
    match list with        
    | [] -> [[]]        
    | x::xs -> 
        let ys = subs xs
        ys @ List.map (fun t -> x::t) ys

printfn "%A" (subs [1;2;3])

Haskell where в значительной степени похож на let, перемещенный на дно.

В F # @ - оператор объединения списков, а :: - минусы.

В F # нет операторных секций, поэтому я использую лямбду (fun).

5 голосов
/ 14 февраля 2011

Давайте сделаем так, чтобы он выглядел больше как F #. :)

let rec subs = function
| [] -> [[]]
| x::xs -> [ for ys in subs xs do
                yield! [ys;x::ys] ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...