Я новачок у Haskell і досі не зрозумів, як зробити щось реалістичне. Я переглянув приклади рецидивів, але реалізація для мене занадто передова.
Я намагаюся встановити відношення рецидивів:
f(t,i) = (2/3)*f(t+1,i+1) + (1/3)*f(t+1,i-1)
але я не можу розібратися, щоб встановити свої типи вхідних даних на f (a, b) або як визначити це взагалі.
Відповіді:
2 для відповіді № 1Хаскелл визначає функції дещо інакшез інших мов - ви не "загортаєте" параметри в дужки, замість цього вони використовуються аналогічно математиці, де це означає "зробіть цей біт спочатку". Таким чином, ваша функція буде виглядати приблизно так, як у 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)