Wie definiere ich das Äquivalent dieser Funktion (aus learnyouahaskell ) in GHCi?
import Data.List
numUniques :: (Eq a) => [a] -> Int
numUniques = length . nub
Ohne die Typdeklaration akzeptiert GHCi die Funktionsdefinition, erhält jedoch einen nicht hilfreichen Typ:
Prelude Data.List> import Data.List
Prelude Data.List> let numUniques' = length . nub
Prelude Data.List> :t numUniques'
numUniques' :: [()] -> Int
Die resultierende Funktion akzeptiert nur eine Liste von Einheiten als Parameter.
Gibt es eine Möglichkeit, Typdeklarationen in GHCi bereitzustellen? Oder gibt es eine andere Möglichkeit, solche Funktionen zu definieren, für die keine Typdeklarationen erforderlich sind?
Ich sah keine offensichtlichen Hinweise im GHCi-Handbuch und experimentierte mit Ausdrücken wie den folgenden (ohne Erfolg):
> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int
quelle
-XNoMonomorphismRestriction
GHCi seit 7.8.1 standardmäßig aktiviert ist: downloads.haskell.org/~ghc/latest/docs/html/users_guide/…Beachten Sie, dass Sie die Monomorphismusbeschränkung auch vermeiden können, indem Sie Ihrem Ausdruck einfach "Punkte" (dh explizite Variablen) hinzufügen. Das ergibt also auch den richtigen Typ:
quelle
Das GHC-Benutzerhandbuch zeigt zwei zusätzliche Möglichkeiten, um dies zu erreichen. In diesem Unterabschnitt wird das Konstrukt
:{
... vorgestellt:}
, das wie folgt verwendet werden kann:> :{ | numUniques :: (Eq a) => [a] -> Int | numUniques = length . nub | :}
Alternativ können Sie den mehrzeiligen Modus aktivieren :
> :set +m > let | numUniques :: (Eq a) => [a] -> Int | numUniques = length . nub |
quelle