✉ fosco.loregian @ gmail.com tetrapharmakon
La Matematica è fatta di diverse aree distinte:
La teoria delle categorie studia ciascuna di queste teorie come un oggetto matematico a sé stante.
Gli oggetti matematici di un dato tipo sono punti in una grande scatola, collegati da frecce componibili
composizione
Eilenberg, S., and Mac Lane S., "General theory of natural equivalences." (1945)
Fino ad ora ho usato la teoria delle categorie per fare
...or not so different
CT è davvero così astratta? (Qualsiasi cosa questo significhi...)
...
nell'ultima settimana, su arXiv
le poche cose, che ho di sicuro frainteso, a proposito di
e della programmazione funzionale
La programmazione funzionale è un paradigma per la produzione di codice che riduce al minimo gli effetti collaterali
f(in) = out
g(in') = out'
in
out = in'
out '
g o f
data List a = Nil | Cons a (List a)
primes :: [Integer]
primes = filter isPrime [1..]
palyPrimes = [p | p <- primes ,
reverse (digits p) == digits p]
sum :: [Integer] -> Integer
sum [] = 0
sum (x:xs) = x + sum xs
squares :: [Integer]
squares = map (\x -> x**2) [1..100]
public static BigInteger[] javaFibs(int n) {
BigInteger[] fibs = new BigInteger[n];
fibs[0] = BigInteger.valueOf(1);
fibs[1] = BigInteger.valueOf(1);
for (int i = 2; i < n; i++)
fibs[i] = fibs[i - 1].add(fibs[i - 2]);
return fibs;
}
Questo è (un) modo di produrre i numeri di Fibonacci in Java:
Questo è lo stesso algoritmo in Haskell:
haskellFibs :: Int -> Integer
haskellFibs n = fibs !! n
where fibs =
1 : 1 : [ a + b | (a, b) <- zip fibs (tail fibs) ]
Non c'è solo una differenza estetica, ma un netto guadagno di prestazione
ESEMPIO: I SOLITI NUMERI DI FIBONACCI
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Text.XML.HXT.*
import Control.Concurrent.Async
...
selectAllEntries :: ArrowXml a => a XmlTree XmlTree
selectAllEntries = deep (isElem >>> hasName "entry")
selectAllTitle :: ArrowXml a => a XmlTree XmlTree
selectAllTitle = deep (isElem >>> hasName "title")
getDaTitles path = runX (readDocument [withHTTP []] path
>>> selectAllEntries
>>> selectAllTitle
>>> deep isText
>>> getText)
main :: IO ()
main = do
xs <- mapConcurrently getDaTitles paths
let zs = map (filter (/= '\n')) $ concat xs
putStrLn $ unlines zs
*ho già detto "fuggite dall'Italia"?
Grazie!