2017-10-08 2 views
0

J'apprends F #. J'ai écrit la fonction de pli personnalisé pour la liste (avec l'aide ici sur StackOverflow). J'essaye maintenant d'écrire la fonction de foldback dites myOwnFoldBack. La sortie attendue pourrait être myOwnFoldBack (+) 0 [1; 2; 3 ] devrait renvoyer 6.F # Ecriture d'une fonction de repli personnalisée pour la liste

Voici mon code pour

myOwnFold
let rec myOwnFoldf s0 = 
    function 
    | [] -> s0 
    | x::tail -> myOwnFoldf (f s0 x) tail 

Cela fonctionne très bien. est ici code pour myOwnFoldBack

let rec myOwnFoldBack f s0 = 
    function 
    | [] -> 0 
    | x::tail -> x f (myOwnFoldBackf tail) 

L'erreur que je reçois est:

Type mismatch. Expecting a 
    'a  
but given a 
    ('b -> 'a -> int) list -> int  
The resulting type would be infinite when unifying ''a' and '('b -> 'a -> int) list -> int' 
+0

semble que vous avez une petite faute de frappe, deuxième 'myOwnFoldBack' est' myOwnFoldBackf' –

+0

je pense à part cela, il y a des problèmes plus. –

+0

Il semble y avoir un peu plus. 'myOwnFoldBackf' renvoie 0 isntead de' s0' en cas de liste vide, et dans l'autre cas vous appliquez 'x' à' f' et vous ne passez pas 's0' à l'appel récursif ... –

Répondre

2

Je pense que j'ai tout compris enfin!

let rec myOwnFoldBack f s0 = 
    function 
    | [] -> s0 
    | x::tail -> f x (myOwnFoldBack f s0 tail)