2016-07-01 20 views
0

Ich bin Anfänger in der Programmierung über Haskell Sprache. Ich bin interessiert an Schreibfunktion in Haskell, die Nebenwirkungen wie diese hat (für pädagogische Zwecke, kann es eine weitere Nebenwirkung):Wie implementiert man Funktion mit Nebenwirkungen?

-- function foo behaves like random numbers generator 
foo :: Int 
{- foo = some magic -} 
-- It can print True or False 
print $ show (foo /= foo) 

Wie ich verstanden, ich habe mit so eine Art Instanz von Monade implementieren Verhalten (so: IO Why are side-effects modeled as monads in Haskell?). Aber ich verstehe wirklich nicht, wie man ein einfaches Beispiel der Funktion für diesen Zweck schreibt.

+1

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! –

+1

'Int' ist nicht der Typ einer Funktion. Es ist nur eine Nummer. – melpomene

+0

Ich möchte nur Beispiele sehen, die die Umsetzung eines solchen Verhaltens zeigen – LmTinyToon

Antwort

1

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 
+0

Ich weiß über System.Random. Ich möchte nur eine Implementierung von solchem ​​Verhalten sehen (für Bildungszwecke kann es einen anderen Nebeneffekt haben) – LmTinyToon

+0

@ АлександрЛысенко Ich habe ein Beispiel hinzugefügt ... Ich bin mir nicht sicher, ob ich verstehe, was Sie wirklich wollen. – chi

+0

Ich möchte eigene Monade erstellen, die Funktionen mit Nebenwirkungen erstellen können. – LmTinyToon