Juan Pablo Yamamoto
jpyamamoto[at]ciencias.unam.mx
Lógica Computacional II. Semestre 2025-1.
:!stack build linear-base
{-# LANGUAGE LinearTypes #-}
{-# LANGUAGE NoImplicitPrelude #-}
import Prelude.Linear
data Par a b = Par a b
:t Par
swapPar :: Par a b %1 -> Par b a
swapPar (Par x y) = Par y x
:t swapPar
data List a = Empty | Cons a (List a)
head :: List a %1 -> (a, List a)
head Empty = error "Vacía"
head (Cons x xs) = (x, xs)
data Unrestricted a where
Unr :: a -> Unrestricted a
longitudLista :: List a %1 -> (Unrestricted Int, List a)
longitudLista Empty = (Unr 0, Empty)
longitudLista (Cons x xs) = case longitudLista xs of
(Unr n, xs') -> (Unr (n+1), Cons x xs')
ignoreLongitud :: List a %1 -> List a
ignoreLongitud l = case longitudLista l of
(Unr _, l') -> l'
:i Ur
import qualified Data.Array.Mutable.Linear as Array
:t Array.alloc
:t Array.set
:t Array.get
:t Array.freeze
:t ($)
:t (&)
($) f x = f x
(&) x f = f x
sumArray :: Num a => Array.Array a %1 -> (Ur a, Array.Array a)
sumArray a = Array.size a &
\(Ur n, a') -> sumArray' (n-1) (fromInteger 0) a'
sumArray' :: Num a => Int -> a -> Array.Array a %1 -> (Ur a, Array.Array a)
sumArray' i s a
| i < 0 = (Ur s, a)
| otherwise = Array.get i a & \(Ur x, a') -> sumArray' (i-1) (s+x) a'
Ur (n, v) = Array.alloc 10 (0 :: Int) (\a -> sumArray a &
\(Ur n, a') -> Array.freeze a' &
\(Ur v) -> Ur (n, v))
(n, v)
(0,[0,0,0,0,0,0,0,0,0,0])
Ur (n', v') = Array.fromList ([0..10] :: [Int]) (\a -> sumArray a &
\(Ur n, a') -> Array.freeze a'&
\(Ur v) -> Ur (n, v))
(n', v')
(55,[0,1,2,3,4,5,6,7,8,9,10])