unison/unison-src/tests/map-traverse2.u
2021-08-24 11:33:27 -07:00

33 lines
700 B
Plaintext

--map/traverse
structural ability Noop where
noop : a -> {Noop} a
structural ability Noop2 where
noop2 : a -> a -> {Noop2} a
structural type List a = Nil | Cons a (List a)
map : (a -> b) -> List a -> List b
map f = cases
List.Nil -> List.Nil
List.Cons h t -> List.Cons (f h) (map f t)
c = List.Cons
z : ∀ a . List a
z = List.Nil
ex = (c 1 (c 2 (c 3 z)))
pureMap : List Text
pureMap = map (a -> "hello") ex
-- `map` is ability polymorphic
zappy : '{Noop} (List Nat)
zappy = 'let map (zap -> Noop.noop (zap Nat.+ 1)) ex
-- mixing multiple abilitys in a call to `map` works fine
zappy2 : '{Noop, Noop2} (List Nat)
zappy2 = 'let
map (zap -> Noop.noop (zap Nat.+ Noop2.noop2 2 7)) ex