2011-09-19 1 views
2

Apprendre Haskell me tue. Si je vais écrire une fonction qui prend un tableau de tableaux d'éléments pouvant être commandés, et qui produit la même chose, comment puis-je faire cela?Haskell frustration avec les appels de fonction

J'essaie:

main = testfn [[1],[2]] 

testfn :: (Ord a) => [[a]] -> [[a]] 
testfn x = x 

Mais le message que je reçois est:

pourrait ne pas correspondre type attendu 'IO t0' avec le type réel '[[a0]]' Dans le expression: principale Lors de la vérification du type de la fonction « principale »

+5

Notez que '[a]' est un _list_, pas un _array_. La différence est assez importante. Haskell a les deux, et ils ont des implications de performance très différentes – bdonlan

Répondre

7

Votre problème ici est que main doit être d'un type de la forme IO a (vous pouvez le voir dans l'erreur - GHC s'attend à ce que le type inféré de principal [[a0]] corresponde à IO t0). Ici main a le type [[Int]]. Vous pouvez facilement résoudre ce problème en imprimant simplement le résultat:

main = print (testfn [[1],[2]]) 
+0

Merci. En ce qui concerne votre commentaire sur ma question, pourriez-vous s'il vous plaît me montrer comment faire la tâche équivalente avec un tableau réel? –

+1

Les tableaux Haskell sont un peu plus d'un sujet avancé, mais fondamentalement, le type ressemblerait à quelque chose comme 'IArray a (Int, Int) => a -> a', ou' Array (Int, Int) Int -> Array (Int , Int) Int'. Voir http://www.haskell.org/haskellwiki/Arrays. Si vous avez d'autres questions sur ce sujet, veuillez ouvrir une question distincte pour que les choses restent organisées. – bdonlan

+0

OK. Je pense que je m'en tiendrai aux listes. J'apprécie l'aide. –

3

La fonction main doit avoir le type IO a. Vous définissez principal comme testfn [..] qui est de type Ord a, Num a => [[a]].

Que voulez-vous que le programme fasse? Comparez à une solution connue pour votre commande?

main = print (knownSolution == testfn [[1],[2]]) 

Ou peut-être imprimer le résultat?

main = print $ testfn [[1],[2]]