2017-02-12 3 views
-3

В то время как я изучал функцию в Haskell, я наткнулся на эту программу, и я не могу понять, как она выполняется.Как понять выполнение этой программы Haskell?

mylength :: [Int] -> Int 
mylength l = foldr f 0 l 
    where 
    f x y = y + 1 
+0

Я проголосовал за закрытие, потому что, по сути, ваш вопрос: «Я не понимаю X. Обучайте меня». Чтобы воспитывать кого-то, необходимо иметь представление о том, что они уже знают, и в этой ситуации то, что конкретно вводит в заблуждение. –

+0

В этой ситуации я бы поспорил, что вы не понимаете функцию 'foldr'. Так почему бы не посмотреть исходный код на 'foldr' и понять это? Если у вас это (или не получилось), вы сможете задать более конкретный вопрос. –

+0

@ ThomasM.DuBuisson Исходный код 'foldr' выглядит так: ' foldr :: (a -> b -> b) -> b -> ta -> b' 'foldr fzt = appEndo (foldMap (Endo #. F) t) z' Как новичок даже знал, с чего начать? – Libby

ответ

2

Эта функция будет выполнена, когда вы вызываете ее со списком номеров. myLength [1,2,3] должен вернуть 3.

foldr принимает три аргумента. Первая функция: здесь это f. Второе - это начальное значение, такое же, как и все, что нужно вернуть. Последний аргумент - это список, который вы собираетесь сложить.

foldr работает (kinda) следующим образом: функция f будет вызвана для каждого элемента списка, последний элемент сначала. В первый раз он получает название последнего элемента списка и 0, возвращая 1. Затем он вызывается со вторым по последнему элементу списка и 1 (результат предыдущего вызова). Таким образом, результат f каждый раз является длиной списка. Когда в списке ничего не осталось, он возвращает это значение, которое оно накопило до сих пор (длина списка).

Приятное упражнение - попытаться написать сложить себя рекурсивным определением. Это может помочь вам лучше понять это.

+2

Фактически, в 'foldr' это последний элемент списка, который используется вместе с' 0', а здесь 'f' возвращает' 1'. Затем, следующий с последним с '1', производя' 2'. И так далее. – chi

+0

ha, вот почему я не должен пытаться ТАК посреди ночи. Благодарю. – Libby

+0

Спасибо, что помогли мне LIbby Теперь у меня есть лучшее понимание функции foldr, это был мой первый вопрос о stackoverflow, и я получил 4 downvotes, честно говоря, это было душераздирающим для новичка, подобного мне. Возможно, это произошло потому, что мой вопрос был глупым. –

Смежные вопросы