Какие хорошие промежуточные проблемы и проекты для обучения Haskell?

Недавно я начал погружаться в Real World Haskell, и в книге представлены некоторые упражнения для эффективной практики.

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

У меня есть умеренное понимание языка и отсутствие опыта работы с другими функциональными языками; Haskell - это мой первый прыжок на эту арену.

Ответ 1

Я нашел Project Euler, помогающий изучать рудиментарные языковые конструкции, чтобы помочь мне разобраться в Haskell. Конечно, это не создает реального приложения с Haskell, но для меня это отличный способ усовершенствовать языковые функции. После этого я могу попытаться перезаписать некоторые мои небольшие приложения python в Haskell (некоторые из них ориентированы на графический интерфейс). Итак, это может быть вашим следующим шагом, взять то, что вы написали на другом языке, и попытаться сделать это в Haskell.

Ответ 2

Здесь проблема, вызванная Почему вопросы функционального программирования Джона Хьюза: найдите наиболее эффективный способ архивирования оцифрованных альбомов записи на DVD:

Проблема заключается в следующем:

  • Я хочу архивировать свою музыкальную коллекцию на DVD. Альбом занимает 300 и 600 Мбайт, а DVD - 4 700 000B. Я хочу упаковать как можно больше альбомов на DVD.

    Если две разные упаковки используют одинаковое количество DVD-дисков, я предпочитаю один, который оставляет наибольшее количество свободного места на наименее полном DVD, так что все остальные DVD-диски максимально полны.

  • Проблема NP-hard, но основным этапом является использование стандартного жадного hueristic:
    • Сначала сортируйте альбомы в список, самый большой.
    • Начните с бесконечного списка пустых DVD-дисков.
    •   repeat
          take the first album from the list
          put the album in the first DVD that has room for it
        until there are no more albums on the list
      
      Запишите все непустые DVD-диски.

Решите эти проблемы программирования:

  1. Внедрить стандартный жадный алгоритм, написав функцию
      pack :: [(Album, Integer)] -> [DVD]
    
    где
      type Album = String
      type DVD = [Album]
    
    Разложите свое решение на отдельные функции, как описано Хьюзом.
  2. Результат упаковки - это чистая функция порядка, в котором альбомы появляются в списке. Ты можешь улучшить упаковку с помощью поиска пузырьков: возьмите отсортированный список, создав новый список, используя этот алгоритм:
      repeat
        probabilistically choose an item from the old list
        remove that item from the old list and place it at the end of the
        new list
      until the old list is empty
    
    Затем вы делаете алчный алгоритм упаковки в возмущенном списке. Если упаковка улучшится, новый заказ затем станет основой для дальнейшие возмущения.

    Вероятностный выбор параметризуется с вероятностью p:

    • Выберите первый элемент с вероятностью p
    • Выберите второй элемент с вероятностью p & times; (1-p)
    • Выберите i -й элемент с вероятностью p & times; (1-p) ^ i-1
    • Выберите последний элемент (в списке длины n) с вероятностью <Я > (1-р) ^ п-1

    Проблема заключается в том, чтобы внедрить упаковку с помощью поиска Bubble

    Ваша функция может принимать в качестве аргумента бесконечный список случайных номера.

    С p = 0.45 и 10 000 итераций поиск пузырьков может последовательно производят упаковки DVD, которые заполнены более чем на 99,5%.

    Подсказки:

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

Ответ 3

Я (медленно) изучаю Haskell тоже, и я использую учебник Напишите себе схему через 48 часов. Возможно, это поможет вам следовать за ним, и если вы хотите, вы всегда можете его продлить.

Ответ 4

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

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

Ответ 5

В rubyquiz.com есть много хороших упражнений, которые хорошо отображают на haskell. Вики haskell имеют haskell реализации некоторых, но не всех из них.

Ответ 6

Я нашел этот проект интересным и хорошо документированным для обучения.

https://github.com/jcollard/unm-hip