Вы можете получить это, определив активный паттерн. Я не совсем уверен, как n + k паттерны работают с Haskell (например, могут ли они когда-нибудь потерпеть неудачу?), Но следующее должно быть хорошим началом:
// Result of matching 'input' against 'add + k'
let (|PlusNum|) add input =
input - add
let rec fib = function
| 0 -> 0
| 1 -> 1
| PlusNum 2 n -> fib n + fib (n+1)
РЕДАКТИРОВАТЬ: на основе комментария sepp2k, вот обновленная версия, которая выходит из строя, если "n" будет отрицательным:
// Result of matching 'input' against 'add + k'
let (|PlusNum|_|) add input =
if input - add < 0 then None
else Some(input - add)