From e44d7d47ec1fd01cb7ec8054fd59fc0ee3987476 Mon Sep 17 00:00:00 2001 From: thimoteus Date: Mon, 12 Oct 2015 16:18:22 -0700 Subject: updated purescript example for compiler version >= 0.7.4.1 --- purescript.html.markdown | 219 +++++++++++++++++++++++++---------------------- 1 file changed, 116 insertions(+), 103 deletions(-) (limited to 'purescript.html.markdown') diff --git a/purescript.html.markdown b/purescript.html.markdown index a006cdff..61287ceb 100644 --- a/purescript.html.markdown +++ b/purescript.html.markdown @@ -2,194 +2,207 @@ language: purescript contributors: - ["Fredrik Dyrkell", "http://www.lexicallyscoped.com"] + - ["Thimoteus", "https://github.com/Thimoteus"] --- PureScript is a small strongly, statically typed language compiling to Javascript. * Learn more at [http://www.purescript.org/](http://www.purescript.org/) -* Documentation: [http://docs.purescript.org/en/latest/](http://docs.purescript.org/en/latest/) +* Documentation: [http://pursuit.purescript.org/](http://pursuit.purescript.org/) * Book: Purescript by Example, [https://leanpub.com/purescript/](https://leanpub.com/purescript/) -```haskell +```purescript -- -- 1. Primitive datatypes that corresponds to their Javascript -- equivalents at runtime. +> import Prelude -- Numbers -1 + 7*5 :: Number -- 36 +> 1.0 + 7.2*5.5 :: Number -- 40.6 +-- Ints +> 1 + 2*5 :: Int -- 11 -- Types are inferred, so the following works fine -9 / 2.5 + 4.4 -- 8 +> 9.0/2.5 + 4.4 -- 8.0 +-- But Ints and Numbers don't mix, so the following won't +> 5/2 + 2.5 -- Expression 2.5 does not have type Int -- Hexadecimal literals -0xff + 1 -- 256 +> 0xff + 1 -- 256 -- Unary negation -6 * -3 -- -18 -6 * negate 3 -- -18 --- Modulus -3 % 2 -- 1 -4 % 2 -- 0 +> 6 * -3 -- -18 +> 6 * negate 3 -- -18 +-- Modulus, from purescript-math (Math) +> 3.0 % 2.0 -- 1.0 +> 4.0 % 2.0 -- 0.0 -- Inspect the type of an expression in psci -:t 9 / 2.5 + 4.4 -- Prim.Number +> :t 9.5/2.5 + 4.4 -- Prim.Number -- Booleans -true :: Boolean -- true -false :: Boolean -- false +> true :: Boolean -- true +> false :: Boolean -- false -- Negation -not true --false -23 == 23 -- true -1 /= 4 -- true -1 >= 4 -- false +> not true -- false +> 23 == 23 -- true +> 1 /= 4 -- true +> 1 >= 4 -- false -- Comparisions < <= > >= -- are defined in terms of compare -compare 1 2 -- LT -compare 2 2 -- EQ -compare 3 2 -- GT +> compare 1 2 -- LT +> compare 2 2 -- EQ +> compare 3 2 -- GT -- Conjunction and Disjunction -true && (9 >= 19 || 1 < 2) -- true +> true && (9 >= 19 || 1 < 2) -- true -- Strings -"Hellow" :: String -- "Hellow" --- Multiline string -"Hellow\ +> "Hellow" :: String -- "Hellow" +-- Multiline string without newlines, to run in psci use the --multi-line-mode flag +> "Hellow\ \orld" -- "Helloworld" +-- Multiline string with newlines +> """Hello +world""" -- "Hello\nworld" -- Concatenate -"such " ++ "amaze" -- "such amaze" +> "such " ++ "amaze" -- "such amaze" -- -- 2. Arrays are Javascript arrays, but must be homogeneous -[1,1,2,3,5,8] :: [Number] -- [1,1,2,3,5,8] -[true, true, false] :: [Boolean] -- [true,true,false] +> [1,1,2,3,5,8] :: Array Number -- [1,1,2,3,5,8] +> [true, true, false] :: Array Boolean -- [true,true,false] -- [1,2, true, "false"] won't work --- `Cannot unify Prim.Number with Prim.Boolean` +-- `Cannot unify Prim.Int with Prim.Boolean` -- Cons (prepend) -1 : [2,4,3] -- [1,2,4,3] +> 1 : [2,4,3] -- [1,2,4,3] -- Requires purescript-arrays (Data.Array) -- and purescript-maybe (Data.Maybe) -- Safe access return Maybe a -head [1,2,3] -- Just (1) -tail [3,2,1] -- Just ([2,1]) -init [1,2,3] -- Just ([1,2]) -last [3,2,1] -- Just (1) +> head [1,2,3] -- Just (1) +> tail [3,2,1] -- Just ([2,1]) +> init [1,2,3] -- Just ([1,2]) +> last [3,2,1] -- Just (1) -- Random access - indexing -[3,4,5,6,7] !! 2 -- Just (5) +> [3,4,5,6,7] !! 2 -- Just (5) -- Range -1..5 -- [1,2,3,4,5] -length [2,2,2] -- 3 -drop 3 [5,4,3,2,1] -- [2,1] -take 3 [5,4,3,2,1] -- [5,4,3] -append [1,2,3] [4,5,6] -- [1,2,3,4,5,6] +> 1..5 -- [1,2,3,4,5] +> length [2,2,2] -- 3 +> drop 3 [5,4,3,2,1] -- [2,1] +> take 3 [5,4,3,2,1] -- [5,4,3] +> append [1,2,3] [4,5,6] -- [1,2,3,4,5,6] -- -- 3. Records are Javascript objects, with zero or more fields, which --- can have different types -let book = {title: "Foucault's pendulum", author: "Umberto Eco"} +-- can have different types. +-- In psci you have to write `let` in front of the function to get a +-- top level binding. +> let book = {title: "Foucault's pendulum", author: "Umberto Eco"} -- Access properties -book.title -- "Foucault's pendulum" +> book.title -- "Foucault's pendulum" -getTitle b = b.title +> let getTitle b = b.title -- Works on all records with a title (but doesn't require any other field) -getTitle book -- "Foucault's pendulum" -getTitle {title: "Weekend in Monaco", artist: "The Rippingtons"} -- "Weekend in Monaco" +> getTitle book -- "Foucault's pendulum" +> getTitle {title: "Weekend in Monaco", artist: "The Rippingtons"} -- "Weekend in Monaco" +-- Can use underscores as shorthand +> _.title book -- "Foucault's pendulum" -- Update a record -changeTitle b t = b {title = t} -changeTitle book "Ill nome della rosa" -- {title: "Ill nome della - -- rosa", author: "Umberto Eco"} +> let changeTitle b t = b {title = t} +> getTitle (changeTitle book "Ill nome della rosa") -- "Ill nome della rosa" -- -- 4. Functions -sumOfSquares x y = x*x+y*y -sumOfSquares 3 4 -- 25 --- In psci you have to write `let` in front of the function to get a --- top level binding -mod x y = x % y -mod 3 2 -- 1 +-- In psci's multiline mode +> let sumOfSquares :: Int -> Int -> Int + sumOfSquares x y = x*x + y*y +> sumOfSquares 3 4 -- 25 +> let myMod x y = x % y +> myMod 3.0 2.0 -- 1.0 -- Infix application of function -3 `mod` 2 -- 1 +> 3 `mod` 2 -- 1 --- function application have higher precedence than all other +-- function application has higher precedence than all other -- operators -sumOfSquares 3 4 * sumOfSquares 4 5 -- 1025 +> sumOfSquares 3 4 * sumOfSquares 4 5 -- 1025 -- Conditional -abs' n = if n>=0 then n else -n -abs' (-3) -- 3 +> let abs' n = if n>=0 then n else -n +> abs' (-3) -- 3 -- Guarded equations -abs n | n >= 0 = n - | otherwise = -n +> let abs'' n | n >= 0 = n + | otherwise = -n -- Pattern matching --- Note the type signature, input is an array of numbers The pattern --- matching destructures and binds the array into parts -first :: [Number] -> Number -first (x:_) = x -first [3,4,5] -- 3 -second :: [Number] -> Number -second (_:y:_) = y -second [3,4,5] -- 4 -sumTwo :: [Number] -> [Number] -sumTwo (x:y:rest) = (x+y) : rest -sumTwo [2,3,4,5,6] -- [5,4,5,6] - --- sumTwo doesn't handle when the array is empty or just have one --- element in which case you get an error +-- Note the type signature, input is a list of numbers. The pattern matching +-- destructures and binds the list into parts. +-- Requires purescript-lists (Data.List) +> let first :: forall a. List a -> a + first (Cons x _) = x +> first (toList [3,4,5]) -- 3 +> let second :: forall a. List a -> a + second (Cons _ (Cons y _)) = y +> second (toList [3,4,5]) -- 4 +> let sumTwo :: List Int -> List Int + sumTwo (Cons x (Cons y rest)) = x + y : rest +> fromList (sumTwo (toList [2,3,4,5,6])) :: Array Int -- [5,4,5,6] + +-- sumTwo doesn't handle when the list is empty or there's only one element in +-- which case you get an error. sumTwo [1] -- Failed pattern match -- Complementing patterns to match -- Good ol' Fibonacci -fib 1 = 1 -fib 2 = 2 -fib x = fib (x-1) + fib (x-2) -fib 10 -- 89 +> let fib 1 = 1 + fib 2 = 2 + fib x = fib (x-1) + fib (x-2) +> fib 10 -- 89 -- Use underscore to match any, where you don't care about the binding name -isZero 0 = true -isZero _ = false +> let isZero 0 = true + isZero _ = false -- Pattern matching on records -ecoTitle {author = "Umberto Eco", title = t} = Just t -ecoTitle _ = Nothing +> let ecoTitle {author = "Umberto Eco", title = t} = Just t + ecoTitle _ = Nothing -ecoTitle book -- Just ("Foucault's pendulum") -ecoTitle {title: "The Quantum Thief", author: "Hannu Rajaniemi"} -- Nothing +> ecoTitle book -- Just ("Foucault's pendulum") +> ecoTitle {title: "The Quantum Thief", author: "Hannu Rajaniemi"} -- Nothing -- ecoTitle requires both field to type check: -ecoTitle {title: "The Quantum Thief"} -- Object does not have property author +> ecoTitle {title: "The Quantum Thief"} -- Object lacks required property "author" -- Lambda expressions -(\x -> x*x) 3 -- 9 -(\x y -> x*x + y*y) 4 5 -- 41 -sqr = \x -> x*x +> (\x -> x*x) 3 -- 9 +> (\x y -> x*x + y*y) 4 5 -- 41 +> let sqr = \x -> x*x -- Currying -add x y = x + y -- is equivalent with -add = \x -> (\y -> x+y) -add3 = add 3 -:t add3 -- Prim.Number -> Prim.Number +> let myAdd x y = x + y -- is equivalent with +> let myAdd' = \x -> \y -> x + y +> let add3 = myAdd 3 +> :t add3 -- Prim.Int -> Prim.Int -- Forward and backward function composition -- drop 3 followed by taking 5 -(drop 3 >>> take 5) (1..20) -- [4,5,6,7,8] +> (drop 3 >>> take 5) (1..20) -- [4,5,6,7,8] -- take 5 followed by dropping 3 -(drop 3 <<< take 5) (1..20) -- [4,5] +> (drop 3 <<< take 5) (1..20) -- [4,5] -- Operations using higher order functions -even x = x % 2 == 0 -filter even (1..10) -- [2,4,6,8,10] -map (\x -> x+11) (1..5) -- [12,13,14,15,16] +> let even x = x `mod` 2 == 0 +> filter even (1..10) -- [2,4,6,8,10] +> map (\x -> x + 11) (1..5) -- [12,13,14,15,16] -- Requires purescript-foldable-traversabe (Data.Foldable) -foldr (+) 0 (1..10) -- 55 -sum (1..10) -- 55 -product (1..10) -- 3628800 +> foldr (+) 0 (1..10) -- 55 +> sum (1..10) -- 55 +> product (1..10) -- 3628800 -- Testing with predicate -any even [1,2,3] -- true -all even [1,2,3] -- false +> any even [1,2,3] -- true +> all even [1,2,3] -- false ``` -- cgit v1.2.3 From c2f15ffd87b116b17244fe6053f385d7cb4dabf0 Mon Sep 17 00:00:00 2001 From: thimoteus Date: Tue, 13 Oct 2015 01:25:56 -0700 Subject: readded haskell syntax highlighting, added line about running examples in psci, removed >'s --- purescript.html.markdown | 193 ++++++++++++++++++++++++----------------------- 1 file changed, 98 insertions(+), 95 deletions(-) (limited to 'purescript.html.markdown') diff --git a/purescript.html.markdown b/purescript.html.markdown index 61287ceb..6d8cfbb9 100644 --- a/purescript.html.markdown +++ b/purescript.html.markdown @@ -11,142 +11,145 @@ PureScript is a small strongly, statically typed language compiling to Javascrip * Documentation: [http://pursuit.purescript.org/](http://pursuit.purescript.org/) * Book: Purescript by Example, [https://leanpub.com/purescript/](https://leanpub.com/purescript/) -```purescript +All the noncommented lines of code can be run in the PSCI REPL, though some will +require the `--multi-line-mode` flag. + +```haskell -- -- 1. Primitive datatypes that corresponds to their Javascript -- equivalents at runtime. -> import Prelude +import Prelude -- Numbers -> 1.0 + 7.2*5.5 :: Number -- 40.6 +1.0 + 7.2*5.5 :: Number -- 40.6 -- Ints -> 1 + 2*5 :: Int -- 11 +1 + 2*5 :: Int -- 11 -- Types are inferred, so the following works fine -> 9.0/2.5 + 4.4 -- 8.0 +9.0/2.5 + 4.4 -- 8.0 -- But Ints and Numbers don't mix, so the following won't -> 5/2 + 2.5 -- Expression 2.5 does not have type Int +5/2 + 2.5 -- Expression 2.5 does not have type Int -- Hexadecimal literals -> 0xff + 1 -- 256 +0xff + 1 -- 256 -- Unary negation -> 6 * -3 -- -18 -> 6 * negate 3 -- -18 +6 * -3 -- -18 +6 * negate 3 -- -18 -- Modulus, from purescript-math (Math) -> 3.0 % 2.0 -- 1.0 -> 4.0 % 2.0 -- 0.0 +3.0 % 2.0 -- 1.0 +4.0 % 2.0 -- 0.0 -- Inspect the type of an expression in psci -> :t 9.5/2.5 + 4.4 -- Prim.Number +:t 9.5/2.5 + 4.4 -- Prim.Number -- Booleans -> true :: Boolean -- true -> false :: Boolean -- false +true :: Boolean -- true +false :: Boolean -- false -- Negation -> not true -- false -> 23 == 23 -- true -> 1 /= 4 -- true -> 1 >= 4 -- false +not true -- false +23 == 23 -- true +1 /= 4 -- true +1 >= 4 -- false -- Comparisions < <= > >= -- are defined in terms of compare -> compare 1 2 -- LT -> compare 2 2 -- EQ -> compare 3 2 -- GT +compare 1 2 -- LT +compare 2 2 -- EQ +compare 3 2 -- GT -- Conjunction and Disjunction -> true && (9 >= 19 || 1 < 2) -- true +true && (9 >= 19 || 1 < 2) -- true -- Strings -> "Hellow" :: String -- "Hellow" +"Hellow" :: String -- "Hellow" -- Multiline string without newlines, to run in psci use the --multi-line-mode flag -> "Hellow\ +"Hellow\ \orld" -- "Helloworld" -- Multiline string with newlines -> """Hello +"""Hello world""" -- "Hello\nworld" -- Concatenate -> "such " ++ "amaze" -- "such amaze" +"such " ++ "amaze" -- "such amaze" -- -- 2. Arrays are Javascript arrays, but must be homogeneous -> [1,1,2,3,5,8] :: Array Number -- [1,1,2,3,5,8] -> [true, true, false] :: Array Boolean -- [true,true,false] +[1,1,2,3,5,8] :: Array Number -- [1,1,2,3,5,8] +[true, true, false] :: Array Boolean -- [true,true,false] -- [1,2, true, "false"] won't work -- `Cannot unify Prim.Int with Prim.Boolean` -- Cons (prepend) -> 1 : [2,4,3] -- [1,2,4,3] +1 : [2,4,3] -- [1,2,4,3] -- Requires purescript-arrays (Data.Array) -- and purescript-maybe (Data.Maybe) -- Safe access return Maybe a -> head [1,2,3] -- Just (1) -> tail [3,2,1] -- Just ([2,1]) -> init [1,2,3] -- Just ([1,2]) -> last [3,2,1] -- Just (1) +head [1,2,3] -- Just (1) +tail [3,2,1] -- Just ([2,1]) +init [1,2,3] -- Just ([1,2]) +last [3,2,1] -- Just (1) -- Random access - indexing -> [3,4,5,6,7] !! 2 -- Just (5) +[3,4,5,6,7] !! 2 -- Just (5) -- Range -> 1..5 -- [1,2,3,4,5] -> length [2,2,2] -- 3 -> drop 3 [5,4,3,2,1] -- [2,1] -> take 3 [5,4,3,2,1] -- [5,4,3] -> append [1,2,3] [4,5,6] -- [1,2,3,4,5,6] +1..5 -- [1,2,3,4,5] +length [2,2,2] -- 3 +drop 3 [5,4,3,2,1] -- [2,1] +take 3 [5,4,3,2,1] -- [5,4,3] +append [1,2,3] [4,5,6] -- [1,2,3,4,5,6] -- -- 3. Records are Javascript objects, with zero or more fields, which -- can have different types. -- In psci you have to write `let` in front of the function to get a -- top level binding. -> let book = {title: "Foucault's pendulum", author: "Umberto Eco"} +let book = {title: "Foucault's pendulum", author: "Umberto Eco"} -- Access properties -> book.title -- "Foucault's pendulum" +book.title -- "Foucault's pendulum" -> let getTitle b = b.title +let getTitle b = b.title -- Works on all records with a title (but doesn't require any other field) -> getTitle book -- "Foucault's pendulum" -> getTitle {title: "Weekend in Monaco", artist: "The Rippingtons"} -- "Weekend in Monaco" +getTitle book -- "Foucault's pendulum" +getTitle {title: "Weekend in Monaco", artist: "The Rippingtons"} -- "Weekend in Monaco" -- Can use underscores as shorthand -> _.title book -- "Foucault's pendulum" +_.title book -- "Foucault's pendulum" -- Update a record -> let changeTitle b t = b {title = t} -> getTitle (changeTitle book "Ill nome della rosa") -- "Ill nome della rosa" +let changeTitle b t = b {title = t} +getTitle (changeTitle book "Ill nome della rosa") -- "Ill nome della rosa" -- -- 4. Functions -- In psci's multiline mode -> let sumOfSquares :: Int -> Int -> Int - sumOfSquares x y = x*x + y*y -> sumOfSquares 3 4 -- 25 -> let myMod x y = x % y -> myMod 3.0 2.0 -- 1.0 +let sumOfSquares :: Int -> Int -> Int + sumOfSquares x y = x*x + y*y +sumOfSquares 3 4 -- 25 +let myMod x y = x % y +myMod 3.0 2.0 -- 1.0 -- Infix application of function -> 3 `mod` 2 -- 1 +3 `mod` 2 -- 1 -- function application has higher precedence than all other -- operators -> sumOfSquares 3 4 * sumOfSquares 4 5 -- 1025 +sumOfSquares 3 4 * sumOfSquares 4 5 -- 1025 -- Conditional -> let abs' n = if n>=0 then n else -n -> abs' (-3) -- 3 +let abs' n = if n>=0 then n else -n +abs' (-3) -- 3 -- Guarded equations -> let abs'' n | n >= 0 = n - | otherwise = -n +let abs'' n | n >= 0 = n + | otherwise = -n -- Pattern matching -- Note the type signature, input is a list of numbers. The pattern matching -- destructures and binds the list into parts. -- Requires purescript-lists (Data.List) -> let first :: forall a. List a -> a - first (Cons x _) = x -> first (toList [3,4,5]) -- 3 -> let second :: forall a. List a -> a - second (Cons _ (Cons y _)) = y -> second (toList [3,4,5]) -- 4 -> let sumTwo :: List Int -> List Int - sumTwo (Cons x (Cons y rest)) = x + y : rest -> fromList (sumTwo (toList [2,3,4,5,6])) :: Array Int -- [5,4,5,6] +let first :: forall a. List a -> a + first (Cons x _) = x +first (toList [3,4,5]) -- 3 +let second :: forall a. List a -> a + second (Cons _ (Cons y _)) = y +second (toList [3,4,5]) -- 4 +let sumTwo :: List Int -> List Int + sumTwo (Cons x (Cons y rest)) = x + y : rest +fromList (sumTwo (toList [2,3,4,5,6])) :: Array Int -- [5,4,5,6] -- sumTwo doesn't handle when the list is empty or there's only one element in -- which case you get an error. @@ -154,55 +157,55 @@ sumTwo [1] -- Failed pattern match -- Complementing patterns to match -- Good ol' Fibonacci -> let fib 1 = 1 - fib 2 = 2 - fib x = fib (x-1) + fib (x-2) -> fib 10 -- 89 +let fib 1 = 1 + fib 2 = 2 + fib x = fib (x-1) + fib (x-2) +fib 10 -- 89 -- Use underscore to match any, where you don't care about the binding name -> let isZero 0 = true - isZero _ = false +let isZero 0 = true + isZero _ = false -- Pattern matching on records -> let ecoTitle {author = "Umberto Eco", title = t} = Just t - ecoTitle _ = Nothing +let ecoTitle {author = "Umberto Eco", title = t} = Just t + ecoTitle _ = Nothing -> ecoTitle book -- Just ("Foucault's pendulum") -> ecoTitle {title: "The Quantum Thief", author: "Hannu Rajaniemi"} -- Nothing +ecoTitle book -- Just ("Foucault's pendulum") +ecoTitle {title: "The Quantum Thief", author: "Hannu Rajaniemi"} -- Nothing -- ecoTitle requires both field to type check: -> ecoTitle {title: "The Quantum Thief"} -- Object lacks required property "author" +ecoTitle {title: "The Quantum Thief"} -- Object lacks required property "author" -- Lambda expressions -> (\x -> x*x) 3 -- 9 -> (\x y -> x*x + y*y) 4 5 -- 41 -> let sqr = \x -> x*x +(\x -> x*x) 3 -- 9 +(\x y -> x*x + y*y) 4 5 -- 41 +let sqr = \x -> x*x -- Currying -> let myAdd x y = x + y -- is equivalent with -> let myAdd' = \x -> \y -> x + y -> let add3 = myAdd 3 -> :t add3 -- Prim.Int -> Prim.Int +let myAdd x y = x + y -- is equivalent with +let myAdd' = \x -> \y -> x + y +let add3 = myAdd 3 +:t add3 -- Prim.Int -> Prim.Int -- Forward and backward function composition -- drop 3 followed by taking 5 -> (drop 3 >>> take 5) (1..20) -- [4,5,6,7,8] +(drop 3 >>> take 5) (1..20) -- [4,5,6,7,8] -- take 5 followed by dropping 3 -> (drop 3 <<< take 5) (1..20) -- [4,5] +(drop 3 <<< take 5) (1..20) -- [4,5] -- Operations using higher order functions -> let even x = x `mod` 2 == 0 -> filter even (1..10) -- [2,4,6,8,10] -> map (\x -> x + 11) (1..5) -- [12,13,14,15,16] +let even x = x `mod` 2 == 0 +filter even (1..10) -- [2,4,6,8,10] +map (\x -> x + 11) (1..5) -- [12,13,14,15,16] -- Requires purescript-foldable-traversabe (Data.Foldable) -> foldr (+) 0 (1..10) -- 55 -> sum (1..10) -- 55 -> product (1..10) -- 3628800 +foldr (+) 0 (1..10) -- 55 +sum (1..10) -- 55 +product (1..10) -- 3628800 -- Testing with predicate -> any even [1,2,3] -- true -> all even [1,2,3] -- false +any even [1,2,3] -- true +all even [1,2,3] -- false ``` -- cgit v1.2.3