2010-01-12 10 views
1

Hey je suis juste en train de réviser pour mon examen de programmation fonctionnelle vendredi et je travaille juste à travers des exercices donnés par notre conférencier. J'en ai rencontré un sur lequel j'apporte un peu d'aide:Haskell: Zip une liste xs avec chaque liste dans la liste yss en utilisant des applications partielles et

6. a) Écris une fonction qui zippe une liste donnée xs avec chaque liste dans une liste yss de listes. Utilisez les applications partielles et les expressions lambda dans la mesure du possible pour définir votre fonction. b) Ecrire une fonction qui zippe chaque liste dans une liste yss de listes avec une liste donnée xs. Utilisez les applications partielles et les expressions lambda dans la mesure du possible pour définir votre fonction. La différence entre vos solutions à la partie a) et la partie b) de ce problème illustre que partiellement fonctions appliquées doivent prendre leurs arguments dans le bon ordre.

Ce que j'ai en ce moment pour (a) est la suivante:

zipAll = (\ xs (YS: ETJ) -> [(zip xs YS)] ++ zipAll xs ETJ)

C'est non-exaustif je sais mais pourrait-on me donner quelques indications?

Répondre

1

Son beau, ça a marché:

zipList :: [a] -> [[b]] -> [[(a,b)]] 
zipList = \xs yss -> c xs yss 
         where 
           c xs [] = [] 
           c xs (ys:yss) = zip xs ys :zipList xs yss 

Juste souhaitent Je n'avais pas posté ceci maintenant: P

1

Il semble que vous manquiez votre cas de base pour que la fonction fonctionne. Le cas de base serait

(\xs [ys] -> [(zip xs ys)]) 

je ne serais probablement passer les paramètres sur le côté droit de l'équation à la place:

zipAll xs (ys:yss) = ... 

mais qui est juste à question de style.

La solution pour une partie (b) est le même, sauf que l'ordre des paramètres est inversé, comme

zipAll (ys:yss) xs = ... 
+0

acclamations, je l'apprécie :) – ChrisMacDee