Haskell определяет функции немного иначе, чем другие языки - вы не обертываете параметры в скобках, вместо этого они используются аналогично математике, где это означает «сделать этот бит первым». Таким образом, ваша функция будет выглядеть немного, как это в Haskell, где нужно просто пробел между именем функции и ваших переменных
f t i = (2/3) * f (t+1) (i+1) + (1/3) * f (t+1) (i-1)
Кроме того, чтобы предотвратить бесконечный цикл, важно создать условия для рекурсии конец, например, если вы просто хотите вернуть t, когда я равен нулю, вы можете это сделать (это предположение, я не уверен, что вы хотите, чтобы ваше состояние было, вы можете иметь более одного)
f t 0 = t
f 10 _ = 10
f t i = (2/3) * f (t+1) (i+1) + (1/3) * f (t+1) (i-1)
Считается хорошей практикой, чтобы добавить тип функции (обычно я бы сделал это как мой первый шаг)
f :: Float -> Float -> Float
f t 0 = t
f 10 _ = 10
f t i = (2/3) * f (t+1) (i+1) + (1/3) * f (t+1) (i-1)
Не могли бы вы рассказать о вычислении, которое вы пытаетесь реализовать? Каково повторение, что такое базовый случай и т. Д.? – LuxuryMode
Помимо базового футляра, этот код выглядит хорошо. –
из-за первого «f (t + 1, i + 1)», было бы очень сложно найти базовый случай, так как мне кажется, что оба аргумента/элемента будут неограниченно расти. – Carsten