F # интерактивная разработка - PullRequest
3 голосов
/ 01 ноября 2009

Исходя из фона Matlab и R, где процесс разработки очень интерактивный (выбор, запуск выделения, исправление, выбор, запуск выделения, исправление и т. Д.), Я пытаюсь понять, как 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 ГБ будет скопирован тенями, и вам быстро не хватит памяти. Создание изменяемого файла не кажется подходящим решением, так как последний запуск программы никогда не изменит его.

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

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

Ответы [ 2 ]

4 голосов
/ 02 ноября 2009

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

Для # 1, как упоминалось ранее, добавление аннотаций типов, к сожалению, необходимо в некоторых случаях, но также ключевое слово inline и "hat-types" могут дать вам утку .

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

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

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

1 голос
/ 01 ноября 2009

К # 1

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

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

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

К № 2:

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

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