пятница, 27 октября 2017 г.

Вопрос. Haskell

По итогам:
http://programmingmindstream.blogspot.ru/2017/10/haskell-vs-count.html?m=1

А как length/count (количество элементов списка) на Haskell реализовано?

Так:

Count [] = 0
Count ( _ : xs ) = 1 + Count xs

?

Или можно как-то эффективнее?

5 комментариев:

  1. Именно так и есть правильно. man оптимизация хвостовой рекурсии

    ОтветитьУдалить
  2. Для length есть разные варианты в разных модулях. Вот один из них:

    length :: [a] -> Int
    length xs = lenAcc xs 0

    lenAcc :: [a] -> Int -> Int
    lenAcc [] n = n
    lenAcc (_:ys) n = lenAcc ys (n+1)

    ОтветитьУдалить
  3. Это не оптимизация. Оптимизировать тут можно форсировав вычисления чанков: lenAcc (_:ys) n = lenAcc ys $! (n + 1); И вообще - лучше не париться и использовать foldr: count = foldr (\x _ -> x + 1) 0. В любом случае делать "в лоб" как у Александра - правильно до тех пор пока действительно не потребуется оптимизация

    ОтветитьУдалить