Articles of haskell

Elenco di tipi diversi?

data Plane = Plane { point :: Point, normal :: Vector Double } data Sphere = Sphere { center :: Point, radius :: Double } class Shape s where intersect :: s -> Ray -> Maybe Point surfaceNormal :: s -> Point -> Vector Double Ho anche realizzato istanze di Shape di Plane e Sphere […]

Come comporre `not` con una funzione di arbitrarietà arbitraria?

Quando ho una qualche funzione di tipo f :: (Ord a) => a -> a -> Bool fab = a > b Mi piacerebbe creare una funzione che avvolga questa funzione con no. per esempio, fai una funzione come questa g :: (Ord a) => a -> a -> Bool gab = not $ fab […]

Come funziona il lavoro derivante in Haskell?

I tipi di dati algebrici (ADT) in Haskell possono diventare automaticamente istanze di alcuni typeclass (come Show , Eq ) derivando da essi. data Maybe a = Nothing | Just a deriving (Eq, Ord) La mia domanda è, come funziona questo deriving , cioè come fa Haskell a sapere come implementare le funzioni del modello […]

Scrivendo foldl usando foldr

In Real World Haskell , Capitolo 4. Programmazione funzionale Scrivi foldl con foldr: — file: ch04/Fold.hs myFoldl :: (a -> b -> a) -> a -> [b] -> a myFoldl fz xs = foldr step id xs z where step xga = g (fax) Il codice di cui sopra mi ha confuso molto, e un […]

Cosa fa la parola chiave `forall` in Haskell / GHC?

Sto iniziando a capire come viene utilizzata la parola chiave forall nei cosiddetti “tipi esistenziali” come questa: data ShowBox = forall s. Show s => SB s Questo è solo un sottoinsieme, tuttavia, di come viene utilizzato forall e semplicemente non riesco a comprendere il suo uso in cose del genere: runST :: forall a. […]

: sprint per valori polimorfici?

Mi chiedo perché :sprint riporta xs = _ in questo caso: Prelude> xs = map (+1) [1..10] Prelude> length xs 10 Prelude> :sprint xs xs = _ Ma non in questo caso: Prelude> xs = map (+1) [1..10] :: [Int] Prelude> length xs 10 Prelude> :sprint xs xs = [_,_,_,_,_,_,_,_,_,_] Nota: ghci con -XNoMonomorphismRestriction . […]

Come ottenere il valore normale dall’azione IO in Haskell

Ho la seguente funzione: get :: Chars -> IO Chars get cs = do char <- getChar let (dats, idx) = (curData cs, curIndex cs) let (x,y:xs) = splitAt idx dats let replacement = x ++ (ord char) : xs return $ Chars replacement idx e sto cercando di ottenere un Chars , non un’azione […]

Sottrazione di denaro

Se vogliamo mappare una funzione che aumenta ogni elemento di un intervallo di 1, potremmo scrivere map (\x -> x + 1) [1..5] ma credo che la maggior parte della gente andrebbe solo per map (+1) [1..5] anziché. Ma questo ovviamente non funziona con (-1) poiché quello è negativo. Quindi la prima cosa che mi […]

Dovrebbe essere evitata la notazione in Haskell?

La maggior parte dei tutorial di Haskell insegnano l’uso della notazione per IO. Ho anche iniziato con la notazione, ma questo rende il mio codice più simile a un linguaggio imperativo più che a un linguaggio FP. Questa settimana ho visto un tutorial utilizzare IO con stringAnalyzer readFile “testfile.txt” invece di usare do main = […]

Cosa significa $ / fare in Haskell?

Quando scrivi funzioni un po ‘più complesse, noto che $ è usato molto ma non ho idea di cosa faccia?