2016-04-23 18 views
0

Ich habe sieben Bücher in sieben Wochen gelesen und arbeite mit Haskell.Haskell 'Der erwartete Typ konnte nicht mit dem tatsächlichen Typ übereinstimmen'

ich mit dem Problem bin zu kämpfen:

eine Art schreiben, die eine Liste und eine Funktion übernimmt, der seine zwei Argumente vergleicht und gibt dann eine sortierte Liste.

Ich suchte online nach Hilfe und fand eine Lösung, aber ich kann nicht einmal die Lösung wegen eines erwarteten zu tatsächlichen Typfehlers laufen lassen.

Hier ist der Code, den ich versucht habe:

module Main where 
import Data.List 
sortList :: (Ord a) => (a -> a -> Ordering) -> [a] -> [a] 
sortList comparator list = sortBy comparator list 

Hier ist der Fehler:

*Main> sortList [5,4,2,7,8,1] 

<interactive>:1:10: 
    Couldn't match expected type `a -> a -> Ordering' 
       with actual type `[t]' 
    In the first argument of `sortList', namely `[5, 4, 2, 7, ....]' 
    In the expression: sortList [5, 4, 2, 7, ....] 
    In an equation for `it': it = sortList [5, 4, 2, ....] 

Meine Gedanken und Versuche:

Vielleicht I rufe ich die Funktion falsch an? Ich bin ziemlich neu in Haskell. Ich habe versucht, viele Suchen zu machen. Alles, was ich zu dem Schluss kommen konnte, ist, dass irgendwo die Typen nicht übereinstimmen. Ich denke, eine Erklärung und Anleitung für das Skript wäre sehr hilfreich für mich.

+1

Well deine Unterschrift dy sagt es: das Aufrufen von 'sortList' erfordert einen' comparator', den Sie nicht angegeben haben ... –

Antwort

2

Ihre Funktion Unterschrift sagt:

"sortList is a function that takes:"

  • function (a -> a -> Ordering) that take two elements of type 'a' and returns an 'Ordering' [this is your comparator]
  • List of items 'a' ([a]) that you are passing it
  • Returns a list of items 'a' ([a])

Probieren Sie es auf diese Weise nennen:

sortList compare [3,2,1] 

Denn hier lesen Sie mehr: https://hackage.haskell.org/package/base-4.8.2.0/docs/Data-Ord.html

und hier: http://zvon.org/other/haskell/Outputprelude/compare_f.html

+0

Das hat funktioniert. Kannst du kurz erklären warum? – Justin

+0

Haben Sie meinen Kommentar gelesen? Sie müssen eine Vergleichsmethode an Ihre Funktion übergeben. "Vergleichen" ist der Komparator, den Sie brauchen. Weitere Lese: http://zvon.org/other/haskell/Outputprelude/compare_f.html und hier: https://hackage.haskell.org/package/base-4.8.2.0/docs/Data -Ord.html – granmirupa

1

Sie rufen die Funktion falsch auf, Sie müssen eine Komparatorfunktion übergeben. Sie übergeben nur eine Liste an die Funktion.

Verwandte Themen