Articles of haskell

Por que o comprimento retorna 1 para uma tupla com 2 elementos e dá um erro para uma tupla com mais elementos?

Estou estudando Haskell usando o livro ” Haskell Programming from First Principles “, e no final do capítulo 4, “tipos de dados básicos”, me deparei com algo que me confundiu. O livro menciona um length function e diz que ele funciona em Lists s. Tudo está bem com isso, mas quando eu tento essa function […]

Lista de diferentes tipos?

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 Eu também fiz as instâncias Plane e Sphere de Shape […]

Como compor `não` com uma function de aridade arbitrária?

Quando eu tenho alguma function do tipo f :: (Ord a) => a -> a -> Bool fab = a > b Eu gostaria de fazer function que envolva essa function com não. por exemplo, fazer function como esta g :: (Ord a) => a -> a -> Bool gab = not $ fab Eu […]

Como funciona o trabalho derivado em Haskell?

Tipos de dados algébricos (ADTs) em Haskell podem se transformar automaticamente em instâncias de alguns typeclass s (como Show , Eq ), derivando deles. data Maybe a = Nothing | Just a deriving (Eq, Ord) Minha pergunta é: como este trabalho deriving , ou seja, como Haskell sabe como implementar as funções da typeclass derivada […]

foldl é cauda recursiva, então como é que o foldr corre mais rápido que o fold?

Eu queria testar foldl vs foldr. Pelo que eu vi, você deve usar o foldl over foldr sempre que puder, devido à otimização de recurs de cauda. Isso faz sentido. No entanto, depois de executar este teste, estou confuso: foldr (demora 0,057s ao usar o comando time): a::a -> [a] -> [a] ax = ([x] […]

Escrevendo foldl usando foldr

Em Real World Haskell , Capítulo 4. Programação Funcional Escreva foldl com 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) O código acima me confundiu muito, e um cara chamado dps […]

O que a palavra-chave `forall` em Haskell / GHC faz?

Estou começando a entender como a palavra-chave forall é usada nos chamados “tipos existenciais” como este: data ShowBox = forall s. Show s => SB s Este é apenas um subconjunto, no entanto, de como forall é usado e eu simplesmente não consigo envolver minha mente em seu uso em coisas como esta: runST :: […]

Como obter o valor normal da ação IO em Haskell

Eu tenho a seguinte function: 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 eu estou querendo obter um Chars , não […]

Subtração de Currying

Se quisermos mapear uma function que aumenta cada elemento de um intervalo em 1, poderíamos escrever map (\x -> x + 1) [1..5] mas eu acho que a maioria das pessoas iria apenas para map (+1) [1..5] em vez de. Mas isso obviamente não funciona com (-1) já que é negativo. Então, a primeira coisa […]

IO acontece fora de ordem ao usar getLine e putStr

Eu sou um iniciante em Haskell, estou apenas começando a envolver minha cabeça em torno de Monads, mas ainda não entendi. Estou escrevendo um jogo que consiste em pedir ao usuário informações e responder. Aqui está uma versão simplificada da minha function: getPoint :: IO Point getPoint = do putStr “Enter x: ” xStr <- […]