Wenn sich foo
wirklich wie ein RNG verhält, muss es einen monadischen Typ haben oder als zusätzlichen Eingang den Zustand des RNG annehmen.
Hier ist ein Beispiel, das System RNG verwendet (die in der IO Monade lebt):
import System.Random
foo :: IO Int
foo = randomRIO (1,5) -- random number between 1 and 5
main :: IO()
main = do
x <- foo
y <- foo
print $ x /= y
In main
wir foo
zweimal rufen Sie einfach an, verbindlich ihre Ergebnisse x,y
, die Int
Typ haben. Dann können wir sie wie üblich vergleichen.
Beachten Sie, dass wir foo /= foo
seit foo :: IO Int
nicht verwenden können, eine Aktion, die ein Int zurückgibt, und wir können Aktionen nicht vergleichen, nur grundlegende Daten wie Ganzzahlen. Aus diesem Grund führen wir zuerst die Aktionen aus und vergleichen dann deren Ergebnisse.
Die main
konnte in einer Zeile zu nutzen einige erweiterte combinators
main = print =<< ((/=) <$> foo <*> foo)
-- or
main = print =<< liftA2 (/=) foo foo
geschrieben werden, aber ich würde auf diese am Anfang nicht konzentrieren.
Ein allgemeineres Beispiel einer Seite effecful Berechnung:
foo :: IORef String -> IO Int
foo s = do
x <- readIORef s -- reading a "variable"
print x -- output
w <- getLine -- input
writeIORef s ("qwerty" ++ x) -- writing a variable
length <$> readIORef s
main :: IO()
main = do
s <- newIORef "dummy"
print =<< foo s
hm, was Sie von uns erwarten Sie zu tun? Du hast bereits herausgefunden, dass du lernen musst, mit Monaden umzugehen, also geh und lese weiter, was auch immer du für ein Haskell-Intro verwendest! –
'Int' ist nicht der Typ einer Funktion. Es ist nur eine Nummer. – melpomene
Ich möchte nur Beispiele sehen, die die Umsetzung eines solchen Verhaltens zeigen – LmTinyToon