F # возвращает список длин списков - PullRequest
0 голосов
/ 05 ноября 2018

Я должен использовать комбинаторы, а не циклы for / while, рекурсию или определенные библиотечные функции из модуля List F #, кроме конструкторов :: и []

В идеале я хочу реализовать карту

Я пытаюсь написать функцию llength, которая возвращает список длин подсписков. Например, длина [[1; 2; 3]; [1; 2]; [1; 2; 3]] должна возвращать [3; 2,3]. У меня также есть функция length, которая возвращает длину списка.

let Tuple f = fun a b -> f (a, b)
let length l : int =
    List.fold (Tuple (fst >> (+) 1)) 0 l

в настоящее время имеют

let llength l : int list =
    List.map (length inner list) list

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

Ответы [ 2 ]

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

Поскольку вы можете использовать некоторые функции, которые в основном имеют цикл (fold, filter ...), могут быть некоторые "обманутые и грязные" способы реализации map. Например, через filter:

let mymap f xs =
    let mutable result = []
    xs
    |> List.filter (fun x ->
        result <- f x :: result
        true)
    |> ignore
    result |> List.rev

Обратите внимание, что List.rev требуется, как объяснено в другом ответе.

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

Поскольку это домашнее задание, я не хочу просто дать вам полностью закодированное решение, но вот несколько советов:

Сначала , поскольку fold разрешено, вы можете реализовать map через fold. Функция свертывания взяла бы список, накопленный «до сих пор», и добавила бы следующий элемент, преобразованный с помощью функции отображения. Хотя результат получится обратным (fold перемещается вперед, но вы готовите на каждом шаге), так что, возможно, это не сработает, если вам не разрешено List.rev.

Второй - самый очевидный, фундаментальный способ: голая рекурсия. Вот способ думать об этом: (1) когда аргумент является пустым списком, результат должен быть пустым списком; (2) когда аргумент является непустым списком, результатом должна быть длина головы аргумента, добавленная к списку длин хвоста аргумента, который может быть вычислен рекурсивно. Попробуйте записать это в F #, и будет ваше решение.

...