F # Fractal - ошибка, которую я не могу понять - PullRequest
1 голос
/ 04 апреля 2011

Я пытаюсь привести пример, который нашел в сети.Это 3D фрактал в F #.Вот оно: http://tomasp.net/blog/infinite-cheese.aspx. Исходный код доступен для скачивания в конце статьи.Статья и пример были написаны в 2007 году, поэтому я думаю, что код немного устарел.Существует один блок кода, который вызывает ошибку, и код не будет компилироваться:

// Returns a cube with filtered sides
let private get_cube(incl_sides) =
    [ for (side,trigs) in cube
        when Set.mem side incl_sides
        ->> trigs ]

Ключевое слово when подчеркнуто, а сообщение об ошибке выглядит следующим образом:

Неожиданное ключевое слово «когда» в выражении.Ожидаемый '->' или другой токен.

Я не могу понять, что с этим не так.В попытке лучше понять код, я искал спецификации языка.Насколько я знаю, нет ничего о функции Set.mem или операторе ->>.Ты хоть представляешь, что может быть не так?

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

Да, версия исходного кода, которая связана с постом в блоге, немного устарела. Вы можете найти самую последнюю (обновленную) версию в F # примеров проекта на CodePlex. Я думаю, что могут быть некоторые другие изменения, поэтому лучше получить версию от CodePlex. (Включает FractalSimple.fs, что является более простой версией, и Fractal.fs, которая также удаляет стороны куба, которые не видны).

Проект содержит стандартный проект Visual Studio 2008/2010 .fsproj. Первоначальная версия в блоге была написана с использованием F # CTP (от VS 2005), которая имела совершенно иную интеграцию с Visual Studio и использовала устаревший формат проекта .fsharpp (до того, как существовал формат MSBUILD).

Конструкции when и ->> использовались в качестве упрощенного синтаксиса для написания запросов, но в настоящее время устарели, чтобы поддерживать синтаксис внутри пониманий в соответствии с остальной частью языка. Как указывает kvb, вы можете использовать обычный if .. then, и единственная нестандартная вещь - это yield!, что означает, что возвращает все элементы данной последовательности .

1 голос
/ 04 апреля 2011

Попробуйте

[for (side, trigs) in cube do
    if Set.contains side incl_sides then
        yield! trigs]

Язык претерпел много изменений с момента написания этого кода.В частности, оператор ->> был заменен на yield!, Set.mem был переименован в более описательный Set.contains, и теперь в пониманиях используется if ... then вместо when.

...