Чистый функционал с использованием F#

Можно ли заставить F# вести себя как чистый функциональный язык, такой как Haskell? Может быть, с использованием некоторых директив компилятора?

PS: так как я родом из C/C++, я хочу заставить себя изучать функциональное программирование, не изучая Haskell:)

5 ответов

Решение

Вы не можете форсировать это поведение в F#, но, как сказал Брайан, дисциплина - ваш лучший друг. Например, не использовать mutable, for или же while петли, ref ключевые слова и т. д. Также придерживайтесь чисто неизменных структур данных (различающееся объединение, список, кортеж, карта и т. д.). Если вам нужно выполнить IO в какой-то момент, создайте свою программу так, чтобы она была отделена от вашего чисто функционального кода.

Не забывайте, что функциональное программирование - это ограничение и изоляция побочных эффектов.

Прошу прощения, но нет. Вы просто должны использовать дисциплину.

Если вы чем-то похожи на меня, вы, вероятно, избежите "хороших вещей", если не заставите себя использовать Haskell вместо F# и использовать Haskell настолько идиоматически, насколько это возможно. Использование алгебраических типов данных вместо объектов, научиться любить лень, охватить монаду и многое другое - гораздо более важная часть Хаскелла и, возможно, некоторые из тонкостей (на мой взгляд) чистого функционального программирования.

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

Пища для размышлений.

Чисто функциональные аспекты Haskell являются фундаментальными для языка. Вы не можете просто перенести это между языками. Это приводит к важным проектным решениям - например, чисто функциональная природа Haskell привела к изобретению монады IO. F# не имеет такого "выпускного клапана" для вычислений с состоянием.

Кроме того, обучение программированию на языке, который поддерживает функциональное программирование, но не требует его применения, может быть поучительным. Многие люди путаются между индивидуальными проектными решениями Haskell (например, монадой ввода-вывода, чтобы снова продемонстрировать большой пример) и тем, как работает функциональное программирование в целом.

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

Нет. В настоящее время F# компилятор не может выполнить эту проверку.

Почему бы просто не начать писать какую-нибудь F# программу для изучения функционального программирования? Я знаю нескольких людей, которые сначала выучили ML/Ocaml/F#, а затем перешли на Хаскелл.

Тогда у вас будет лучшее понимание чистоты. (Если вы действительно не касались какого-либо функционального языка программирования раньше, ваше понимание чистого функционала может быть поверхностным.)

Другие вопросы по тегам