Это может произойти по одной из трех причин: -
1) Отсутствует установка VC ++: Установите все версии пакетов перераспределения VC ++ VC9, VC10, VC11, VC13, VC14 и VC15. См. Ссылку, указанную в конце для ссылки для загрузки. Если у вас 64-разрядная Windows, вы должны установить как 32, так и 64-битные версии каждого пакета VisualC ++, даже если вы не используете бит Wampserver 64.
2) Вы забыли предоставить права администратора на WAMP Server : Запуск и установка с параметром «Запуск от имени администратора» очень важны.
3) WAMP, IIS и Skype сражаются за один и тот же порт:
Если вы хотите отследить, сколько раз вызывается функция, вы должны указать это как вход. Нет другого способа сделать это, потому что 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)