Wenn Sie look at the documentation, sehen Sie, dass der Typ für (<)
gegeben als
(<) :: a -> a -> Bool
Dies ist irreführend!
Die Typdeklaration erscheint in einer typeclass Definition:
class Eq a => Ord a where ...
So ist die volle Art ist
(<) :: Ord a => a -> a -> Bool
Übrigens, wenn Sie GHCI fragen, was (<)
‚s-Typ ist, wird es es richtig .
Prelude> :t (<)
(<) :: (Ord a) => a -> a -> Bool
Beachten Sie auch, gibt es bereits eine Funktion min
, in der gleichen typeclass genannt.
min :: Ord a => a -> a -> a
So können Sie Ihre Funktion nicht aufrufen min
, wenn Sie das Original min
verstecken. (Ich werde nicht zeigen, wie. Einen anderen Namen stattdessen für Ihre Funktion verwenden.)
Schließlich haben Sie jetzt
min :: Ord a => a -> a -> Bool
min a b = if a < b then True else False
Als Sarah merkt, if blah then True else False
ist die gleiche wie blah
, so dass Sie auf die klareren
min :: Ord a => a -> a -> Bool
min a b = a < b
Jetzt Betreiber in Haskell sind nur Funktionen mit lustigen Namen vereinfachen --- dies ist das gleiche wie
min :: Ord a => a -> a -> Bool
min a b = (<) a b
Wir können dies weiter vereinfachen:
min :: Ord a => a -> a -> Bool
min = (<)
So Ihre min
ist nur ein anderer Name für (<)
. Warum nicht einfach das Original <
anstelle Ihrer min
verwenden?
wenn foo dann True else False kann immer umgeschrieben werden als einfach foo – Sarah
Danke dafür! –
Und das nächste Mal, wenn Sie Zweifel haben, können Sie einfach die Typ-Annotation im oberen Bereich weglassen und den Compiler in vielen Fällen fragen. Also: t min gibt mir den korrekten Typ mit der Ord-Einschränkung, wenn ich ghci darüber befrage. – Sarah