Если вы хотите отследить, сколько раз вызывается функция, вы должны указать это как вход. Нет другого способа сделать это, потому что Haskell позволяет вам работать только с аргументами, которые передаются в функцию.
Например, скажем, я хотел вычислить факториал, но я хотел отследить, сколько шагов потребовалось. Моя сигнатура функции может выглядеть так:
factorial :: Int -> (Int, Int) -- Takes a number, returns the number and recursion count
factorialInternal :: (Int, Int) -> (Int, Int) -- This actually does the recursion
, а затем определения могут выглядеть так:
factorial n = factorialInternal (n, 0)
factorialInternal (1, n) = (1, n + 1)
factorialInternal (x, n) = let (y, z) = factorialInternal (x-1, n) in (x * y, z + 1)
По сути, параметр, отслеживающий количество рекурсии, увеличивается на каждом уровне, и затем становится частью вывода factorial
.
Это определенно помогает создать интерфейсную функцию, так что вам не нужно вручную вводить начальный уровень рекурсии при использовании функции (которая всегда равна нулю, в любом случае). Пример того, как могут выглядеть сигнатуры вашей функции:
-- The function you call
calculateDifference :: (Int, Int, Int) -> (Int, Int, Int) -> Int
-- What the calculateDifference function calls (the third parameter is the recursion counter)
calculateDifferenceInternal :: (Int, Int, Int) -> (Int, Int, Int) -> Int -> Int
Отсюда вы сможете понять, как реализовать calculateDifference
и calculateDifferenceInternal
.
РЕДАКТИРОВАТЬ: Как указывал Амаллой, лучшее решение состоит в том, чтобы просто вывести счетчик, а не принимать один: поэтому вместо factorialInternal :: (Int, Int) -> (Int, Int)
, factorialInternal Int -> (Int, Int)
будет работать. Тогда определение будет выглядеть так:
factorialInternal 1 = (1, 0)
factorialInternal n = let (x, y) = factorialInternal (n - 1) in (n * x, y + 1)
Да, выполнение его некоторое время и я еще не поразил проблем. Не может сказать, что я имею, используют все это день каждый день, но я создал WPF, WinForms, сеть и Консольные приложения с нею для тестирования различных вещей и не имел никаких помех.
У меня есть он на моем Dell X1, который является эффективно моим "Нетбуком", и это действительно довольно быстро. Единственный незначительный сбой, который я имел вообще, является некоторыми проблемами с графическим ускорением, но это до драйвера Intel, я использую быть старым драйвером XP, и это легко работалось вокруг.
Я выполнял его в VM в Рабочем столе Параллелей 4 на MacBook Pro. Абсолютно никакие проблемы для разговора о.
(Нет никакого звука в Windows 7, как виртуализировано через Параллели, который является известной проблемой — но не очень подходящий для операции Visual Studio.)
Jeroen,
Я не мог установить выпуск Разработчика Команды 2008 года - продолжают получать ошибку разрешения. Я, однако, был в состоянии к insall выпуск Базы данных Команды 2008 года. Я обычно устанавливаю оба выпуска, так отчасти бездельничаюсь о том, чтобы не заставлять выпуск Разработчика установить. Снимок экрана ошибки здесь, если Вам любопытно.
Нет проблем с групповой версией, но использовать ее только для веб-проектов.
Я использую его на работе с RC1 и не сталкивался с какими-либо проблемами. Разработали приложение WinForms, сайт WebForms и сейчас работаем над проектом MVC.
У меня не было никаких проблем с запуском Visual Studio 2008 Pro в 32-битной и 64-битной версиях Windows 7 на постоянной основе Разработка на C ++.
Если приложение, которое вы разрабатываете, не Я не знаю, почему это происходит, вероятно, это связано с конкретными настройками учетной записи пользователя.