Articles of haskell

¿Por qué la longitud devuelve 1 para una tupla con 2 elementos y da un error para una tupla con más elementos?

Estoy estudiando Haskell usando el libro ” Haskell Programming from First Principles “, y hacia el final del Capítulo 4, “Basic datatypes”, me encontré con algo que me confundió. El libro menciona una length función y dice que funciona en Lists s. Todo está bien con eso, pero cuando pruebo esta función de length con […]

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 También hice instancias de Shape de Plane y Sphere . […]

¿Cómo componer `no` con una función de aridad arbitraria?

Cuando tengo alguna función de tipo como f :: (Ord a) => a -> a -> Bool fab = a > b Me gustaría hacer una función que ajuste esta función con no. por ejemplo, hacer funcionar de esta manera g :: (Ord a) => a -> a -> Bool gab = not $ fab […]

foldl es cola recursiva, entonces, ¿cómo es que foldr se ejecuta más rápido que foldl?

Quería probar foldl vs foldr. Por lo que he visto, debes usar foldl sobre foldr siempre que puedas debido a la optimización de la recursión de la cola. Esto tiene sentido. Sin embargo, después de ejecutar esta prueba, estoy confundido: foldr (toma 0.057s cuando se usa el comando de tiempo): a::a -> [a] -> [a] […]

Mónadas con Join () en lugar de Bind ()

Las mónadas generalmente se explican en turnos de return y bind . Sin embargo, supongo que también puedes implementar bind en términos de join (y fmap ?) En los lenguajes de progtwigción que carecen de funciones de primera clase, el bind es insoportablemente incómodo de usar. join , por otro lado, parece bastante fácil. Sin […]

Escribir foldl usando foldr

En Real World Haskell , Capítulo 4. Progtwigción funcional Escribe 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) El código anterior me confundió mucho, y un tipo llamado dps […]

: sprint para valores polimórficos?

Me pregunto por qué :sprint informa xs = _ en este caso: Prelude> xs = map (+1) [1..10] Prelude> length xs 10 Prelude> :sprint xs xs = _ Pero no en este caso: Prelude> xs = map (+1) [1..10] :: [Int] Prelude> length xs 10 Prelude> :sprint xs xs = [_,_,_,_,_,_,_,_,_,_] Nota: Estoy ejecutando ghci […]

Cómo obtener el valor normal de la acción IO en Haskell

Tengo la siguiente función: 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 y quiero obtener un Chars de él, no una acción […]

Sustracción de curry

Si queremos mapear una función que aumenta cada elemento de un rango en 1, podríamos escribir map (\x -> x + 1) [1..5] pero supongo que la mayoría de la gente solo iría por map (+1) [1..5] en lugar. Pero esto obviamente no funciona con (-1) ya que es negativo. Entonces, lo primero que se […]

IO pasa fuera de servicio al usar getLine y putStr

Soy un principiante de Haskell, estoy empezando a entender a las Mónadas, pero todavía no lo entiendo. Estoy escribiendo un juego que consiste en pedirle al usuario su opinión y responderle. Aquí hay una versión simplificada de mi función: getPoint :: IO Point getPoint = do putStr “Enter x: ” xStr <- getLine putStr "Enter […]