Что нужно иметь в виду при изучении F #, изучив схему - PullRequest
6 голосов
/ 08 декабря 2010

Я очень заинтересован в изучении F #.

Мой единственный опыт работы с функциональными языками - это 2 вводных курса по Scheme в колледже.

Есть ли что-то, что я должен иметь в видуво время изучения F #, предварительно изучив схему?Какие-нибудь различия в методологиях, ошибках или других вещах, которые могут доставить мне неприятности?

Ответы [ 3 ]

5 голосов
/ 08 декабря 2010

Есть ли что-то, о чем я должен помнить, изучая F #, предварительно изучив Scheme?Какие-нибудь различия в методологиях, ошибках или других вещах, которые могут доставить мне неприятности?

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

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

type list1<'a> = List1 of 'a * 'a list

let xs = List1(1, [])
let ys = List1(2, [3; 4])

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

Теперь, функция reduce не имеет смысла для пустой последовательности, поэтому встроенная реализация для списков barfs во время выполнения сисключение, если он встречает пустую последовательность:

> List.reduce (+) [];;
System.ArgumentException: The input list was empty.
Parameter name: list
   at Microsoft.FSharp.Collections.ListModule.Reduce[T](FSharpFunc`2 reduction, FSharpList`1 list)
   at <StartupCode$FSI_0271>.$FSI_0271.main@()
Stopped due to error

С нашей новой последовательностью из одного или нескольких элементов мы можем теперь написать функцию reduce, которая никогда не преграждает во время выполнения с исключением, потому что ее вводгарантируется непустой системой типов:

let rec reduce f = function
  | List1(x, []) -> x
  | List1(x0, x1::xs) -> f x0 (reduce f (List1(x1, xs)))

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

3 голосов
/ 08 декабря 2010

Схема - хороший функциональный язык; изучение его в школе должно обеспечить хорошую основу для функционального программирования.

F # имеет статическую типизацию, тогда как схема является динамической, так что это одно очевидное отличие. Если у вас есть опыт работы с другими статическими языками (особенно с языками .NET, такими как C #), это не будет иметь большого значения, но если большая часть вашего опыта будет динамичной, это будет изменение.

Важно узнать имена основных функций функционального программирования F # (такие вещи, как List.map); почти каждый функциональный язык имеет один и тот же базовый набор, но часто с разными именами (я не помню, чтобы основные имена Схем сравнивались).

Если у вас есть старые «программные задания» Схемы с удобными примерами входов / выходов, может быть полезно перекодировать их в F # для «разогрева» с языком.

1 голос
/ 08 декабря 2010

Я предлагаю рассмотреть также Haskell, и они примерно принадлежат к тому же семейству, что и F # и ML, и Haskell содержит много интересных функциональных концепций, которых нет нигде.

Взгляните на tryhaskell.org для интерактивного онлайн-учебника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...