2009-11-01 3 views
3

Исходя из фона Matlab и R, где процесс разработки очень интерактивен (выберите, запустите выбор, исправьте, выберите, запустите выбор, исправить и т. Д.), Я пытаюсь понять, как F # обрабатывает этот стиль развития, что представляется весьма важным в научных приложениях. Вот несколько вещей, которые просто сразу приходят на ум, чтобы кто-нибудь новые для F #:F # интерактивное развитие

  1. Выбор несколько строк дают различные результаты, чем по одной строке за раз.

    let add x y = x + y 
    add 4.1 2.3 
    

    Выбор обеих линий результатов в то время как float -> float -> float выбирая первые результаты строки в int -> int -> int. В более общем плане, пользователи Matlab/R используются для распечатки результатов после каждого утверждения, а не в конце.

  2. Теневое копирование может стать обременительным.

    let file = open2GBfile('file.txt') 
    process file 
    

    Если запустить эту интерактивно снова и снова, файл 2 Гб является теневой скопированой, и вы быстро запустить из памяти. Создание файла mutable не похоже на подходящее решение, так как окончательный запуск программы никогда не изменит его.

Учитывая эти проблемы, это невозможно для системы, основанной fsi.exe для поддержки Matlab/R стиль интерактивного развития?

[Edit: Я предполагаю, что около 2. Do объекты получают помечаются для удаления, как только они затенены]

ответ

4

Я бы не ожидал, что F # станет заменой для Matlab/R, потому что в отличие от них F # является языком программирования общего назначения. Не все, что вам нужно для определенного типа работы, будет в стандартных библиотеках. Но это не означает, что «интерактивное развитие», которое вы описываете, невозможно, может потребоваться некоторое усилие для создания функций библиотеки, от которых вы зависите.

Для # 1, как упоминалось ранее, в некоторых случаях, к сожалению, необходимо добавить аннотации типов, но также ключевое слово inline и «типы шляп» могут give you duck-typing.

Для # 2, я не знаю, что ваши open и process функции делают, в отличие от того, что вы хотите от них делать.Например, функция open может:

  • Читать весь файл сразу, вернуть данные в виде массива/список/и т.д., а затем закройте файл
  • возвращающих FileStream объекта, который вы звоните process, но забудьте закрыть.
  • Возвращение выражение последовательности, так что вы можете лениво перебирать содержимое файла
  • Memoize результат одного из выше, так что последующие вызовы просто возвращают кэшированный результат
  • Один из Gazillion других способов создания абстракции доступ к файлам.

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

+0

Я имел в виду открытый стиль Matlab/R. Он, например, открывает файл csv и помещает его в большой массив/матрицу. Мое беспокойство заключается в том, что если я затем снова заберу и запустим этот код, что происходит в интерактивном стиле разработки, у меня будет две большие матрицы, одна из которых будет затенена. Я прав? – Tristan

+0

@Tristan: сборка мусора .Net должна избавиться от лишних «теневых копий», когда вы ссылаетесь на них. Оригинальный пост звучал так, будто вы пробовали это, и это было проблемой. Теперь, похоже, вы просто догадываетесь, что это будет проблемой. Не могли бы вы это понять? –

+0

@ Джон: Да, я угадываю. Я пытаюсь выяснить, '' let = x 1 ;; пусть x = 2 ;; '' это то же самое, что 'x 'выходит за рамки. Оставляет ли объект x = 1 помечен для удаления, как только я 'let x = 2''? Книга Криса Смита относится к этому как к тени. – Tristan

1

Для # 1

В FSI, вы должны ввести ;; на конец каждого оператора и получить результаты непосредственно:

> 1 + 2;; 
val it : int = 3 

Обычно использует F # -Codefile следует рассматривать как совокупность отдельных функций, которые вы должны позвонить и оценить в интерактивном режиме, а не в виде последовательности шагов, которые производят значение будет показано.

Для # 2:

Это, как представляется, проблема самого кода: Сделайте file функцию, поэтому чтение/копирование выполняется только когда и где действительно необходимо (в противном случае пусть связывание будет оцениваться в начало).

+0

Проблема в том, что это изменяет выводы типа. – Tristan

+1

Затем аннотируйте типы явно, где их нельзя избежать. – Dario

+0

Обратите внимание, что это ошибка системы типа F #. В интерактивном Haskell (GHCi) это намного лучше, потому что система типов может обобщать такие функции, используя классные классы. – Dario

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