mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-02 08:11:12 +00:00
improve benchmark error handling, bugfixes
This commit is contained in:
parent
65ebeab303
commit
8861c9394a
7 changed files with 86 additions and 45 deletions
|
@ -6,9 +6,10 @@ app "cfold"
|
||||||
# adapted from https://github.com/koka-lang/koka/blob/master/test/bench/haskell/cfold.hs
|
# adapted from https://github.com/koka-lang/koka/blob/master/test/bench/haskell/cfold.hs
|
||||||
main : Task.Task {} []
|
main : Task.Task {} []
|
||||||
main =
|
main =
|
||||||
Task.after
|
inputResult <- Task.attempt Task.getInt
|
||||||
Task.getInt
|
|
||||||
\n ->
|
when inputResult is
|
||||||
|
Ok n ->
|
||||||
e = mkExpr n 1 # original koka n = 20 (set `ulimit -s unlimited` to avoid stack overflow for n = 20)
|
e = mkExpr n 1 # original koka n = 20 (set `ulimit -s unlimited` to avoid stack overflow for n = 20)
|
||||||
unoptimized = eval e
|
unoptimized = eval e
|
||||||
optimized = eval (constFolding (reassoc e))
|
optimized = eval (constFolding (reassoc e))
|
||||||
|
@ -19,6 +20,9 @@ main =
|
||||||
|> Str.concat (Num.toStr optimized)
|
|> Str.concat (Num.toStr optimized)
|
||||||
|> Task.putLine
|
|> Task.putLine
|
||||||
|
|
||||||
|
Err GetIntError ->
|
||||||
|
Task.putLine "Error: Failed to get Integer from stdin."
|
||||||
|
|
||||||
Expr : [
|
Expr : [
|
||||||
Add Expr Expr,
|
Add Expr Expr,
|
||||||
Mul Expr Expr,
|
Mul Expr Expr,
|
||||||
|
|
|
@ -8,9 +8,10 @@ IO a : Task.Task a []
|
||||||
|
|
||||||
main : Task.Task {} []
|
main : Task.Task {} []
|
||||||
main =
|
main =
|
||||||
Task.after
|
inputResult <- Task.attempt Task.getInt
|
||||||
Task.getInt
|
|
||||||
\n ->
|
when inputResult is
|
||||||
|
Ok n ->
|
||||||
x : Expr
|
x : Expr
|
||||||
x = Var "x"
|
x = Var "x"
|
||||||
|
|
||||||
|
@ -20,6 +21,10 @@ main =
|
||||||
nest deriv n f # original koka n = 10
|
nest deriv n f # original koka n = 10
|
||||||
|> Task.map \_ -> {}
|
|> Task.map \_ -> {}
|
||||||
|
|
||||||
|
Err GetIntError ->
|
||||||
|
Task.putLine "Error: Failed to get Integer from stdin."
|
||||||
|
|
||||||
|
|
||||||
nest : (I64, Expr -> IO Expr), I64, Expr -> IO Expr
|
nest : (I64, Expr -> IO Expr), I64, Expr -> IO Expr
|
||||||
nest = \f, n, e -> Task.loop { s: n, f, m: n, x: e } nestHelp
|
nest = \f, n, e -> Task.loop { s: n, f, m: n, x: e } nestHelp
|
||||||
|
|
||||||
|
|
|
@ -5,32 +5,31 @@ app "nqueens"
|
||||||
|
|
||||||
main : Task.Task {} []
|
main : Task.Task {} []
|
||||||
main =
|
main =
|
||||||
Task.after
|
inputResult <- Task.attempt Task.getInt
|
||||||
Task.getInt
|
|
||||||
\n ->
|
when inputResult is
|
||||||
|
Ok n ->
|
||||||
queens n # original koka 13
|
queens n # original koka 13
|
||||||
|> Num.toStr
|
|> Num.toStr
|
||||||
|> Task.putLine
|
|> Task.putLine
|
||||||
|
|
||||||
|
Err GetIntError ->
|
||||||
|
Task.putLine "Error: Failed to get Integer from stdin."
|
||||||
|
|
||||||
ConsList a : [Nil, Cons a (ConsList a)]
|
ConsList a : [Nil, Cons a (ConsList a)]
|
||||||
|
|
||||||
queens = \n -> length (findSolutions n n)
|
queens = \n -> length (findSolutions n n)
|
||||||
|
|
||||||
length : ConsList a -> I64
|
findSolutions = \n, k ->
|
||||||
length = \xs -> lengthHelp xs 0
|
if k <= 0 then # should we use U64 as input type here instead?
|
||||||
|
Cons Nil Nil
|
||||||
|
else
|
||||||
|
extend n Nil (findSolutions n (k - 1))
|
||||||
|
|
||||||
lengthHelp : ConsList a, I64 -> I64
|
extend = \n, acc, solutions ->
|
||||||
lengthHelp = \foobar, acc ->
|
when solutions is
|
||||||
when foobar is
|
|
||||||
Cons _ lrest -> lengthHelp lrest (1 + acc)
|
|
||||||
Nil -> acc
|
Nil -> acc
|
||||||
|
Cons soln rest -> extend n (appendSafe n soln acc) rest
|
||||||
safe : I64, I64, ConsList I64 -> Bool
|
|
||||||
safe = \queen, diagonal, xs ->
|
|
||||||
when xs is
|
|
||||||
Nil -> Bool.true
|
|
||||||
Cons q t ->
|
|
||||||
queen != q && queen != q + diagonal && queen != q - diagonal && safe queen (diagonal + 1) t
|
|
||||||
|
|
||||||
appendSafe : I64, ConsList I64, ConsList (ConsList I64) -> ConsList (ConsList I64)
|
appendSafe : I64, ConsList I64, ConsList (ConsList I64) -> ConsList (ConsList I64)
|
||||||
appendSafe = \k, soln, solns ->
|
appendSafe = \k, soln, solns ->
|
||||||
|
@ -41,13 +40,22 @@ appendSafe = \k, soln, solns ->
|
||||||
else
|
else
|
||||||
appendSafe (k - 1) soln solns
|
appendSafe (k - 1) soln solns
|
||||||
|
|
||||||
extend = \n, acc, solutions ->
|
|
||||||
when solutions is
|
|
||||||
Nil -> acc
|
|
||||||
Cons soln rest -> extend n (appendSafe n soln acc) rest
|
|
||||||
|
|
||||||
findSolutions = \n, k ->
|
safe : I64, I64, ConsList I64 -> Bool
|
||||||
if k == 0 then
|
safe = \queen, diagonal, xs ->
|
||||||
Cons Nil Nil
|
when xs is
|
||||||
else
|
Nil -> Bool.true
|
||||||
extend n Nil (findSolutions n (k - 1))
|
Cons q t ->
|
||||||
|
queen != q && queen != q + diagonal && queen != q - diagonal && safe queen (diagonal + 1) t
|
||||||
|
|
||||||
|
|
||||||
|
length : ConsList a -> I64
|
||||||
|
length = \xs ->
|
||||||
|
dbg "length"
|
||||||
|
lengthHelp xs 0
|
||||||
|
|
||||||
|
lengthHelp : ConsList a, I64 -> I64
|
||||||
|
lengthHelp = \foobar, acc ->
|
||||||
|
when foobar is
|
||||||
|
Cons _ lrest -> lengthHelp lrest (1 + acc)
|
||||||
|
Nil -> acc
|
||||||
|
|
|
@ -5,9 +5,10 @@ app "quicksortapp"
|
||||||
|
|
||||||
main : Task.Task {} []
|
main : Task.Task {} []
|
||||||
main =
|
main =
|
||||||
Task.after
|
inputResult <- Task.attempt Task.getInt
|
||||||
Task.getInt
|
|
||||||
\n ->
|
when inputResult is
|
||||||
|
Ok n ->
|
||||||
unsortedList =
|
unsortedList =
|
||||||
if n == 0 then
|
if n == 0 then
|
||||||
# small unsorted list of 20 elements (0-9)
|
# small unsorted list of 20 elements (0-9)
|
||||||
|
@ -20,6 +21,10 @@ main =
|
||||||
|> Quicksort.show
|
|> Quicksort.show
|
||||||
|> Task.putLine
|
|> Task.putLine
|
||||||
|
|
||||||
|
Err GetIntError ->
|
||||||
|
Task.putLine "Error: Failed to get Integer from stdin."
|
||||||
|
|
||||||
|
|
||||||
sort : List I64 -> List I64
|
sort : List I64 -> List I64
|
||||||
sort = \list ->
|
sort = \list ->
|
||||||
Quicksort.sortWith list (\x, y -> Num.compare x y)
|
Quicksort.sortWith list (\x, y -> Num.compare x y)
|
||||||
|
|
|
@ -40,9 +40,10 @@ fold = \f, tree, b ->
|
||||||
|
|
||||||
main : Task.Task {} []
|
main : Task.Task {} []
|
||||||
main =
|
main =
|
||||||
Task.after
|
inputResult <- Task.attempt Task.getInt
|
||||||
Task.getInt
|
|
||||||
\n ->
|
when inputResult is
|
||||||
|
Ok n ->
|
||||||
# original koka n = 4_200_000
|
# original koka n = 4_200_000
|
||||||
ms : ConsList Map
|
ms : ConsList Map
|
||||||
ms = makeMap 5 n
|
ms = makeMap 5 n
|
||||||
|
@ -58,6 +59,9 @@ main =
|
||||||
Nil ->
|
Nil ->
|
||||||
Task.putLine "fail"
|
Task.putLine "fail"
|
||||||
|
|
||||||
|
Err GetIntError ->
|
||||||
|
Task.putLine "Error: Failed to get Integer from stdin."
|
||||||
|
|
||||||
insert : Tree (Num k) v, Num k, v -> Tree (Num k) v
|
insert : Tree (Num k) v, Num k, v -> Tree (Num k) v
|
||||||
insert = \t, k, v -> if isRed t then setBlack (ins t k v) else ins t k v
|
insert = \t, k, v -> if isRed t then setBlack (ins t k v) else ins t k v
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,10 @@ ConsList a : [Nil, Cons a (ConsList a)]
|
||||||
|
|
||||||
main : Task.Task {} []
|
main : Task.Task {} []
|
||||||
main =
|
main =
|
||||||
Task.after
|
inputResult <- Task.attempt Task.getInt
|
||||||
Task.getInt
|
|
||||||
\n ->
|
when inputResult is
|
||||||
|
Ok n ->
|
||||||
m = makeMap n # koka original n = 4_200_000
|
m = makeMap n # koka original n = 4_200_000
|
||||||
val = fold (\_, v, r -> if v then r + 1 else r) m 0
|
val = fold (\_, v, r -> if v then r + 1 else r) m 0
|
||||||
|
|
||||||
|
@ -23,6 +24,10 @@ main =
|
||||||
|> Num.toStr
|
|> Num.toStr
|
||||||
|> Task.putLine
|
|> Task.putLine
|
||||||
|
|
||||||
|
Err GetIntError ->
|
||||||
|
Task.putLine "Error: Failed to get Integer from stdin."
|
||||||
|
|
||||||
|
|
||||||
boom : Str -> a
|
boom : Str -> a
|
||||||
boom = \_ -> boom ""
|
boom = \_ -> boom ""
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
interface Task
|
interface Task
|
||||||
exposes [Task, succeed, fail, after, map, putLine, putInt, getInt, forever, loop]
|
exposes [Task, succeed, fail, after, map, putLine, putInt, getInt, forever, loop, attempt]
|
||||||
imports [pf.Effect]
|
imports [pf.Effect]
|
||||||
|
|
||||||
Task ok err : Effect.Effect (Result ok err)
|
Task ok err : Effect.Effect (Result ok err)
|
||||||
|
@ -46,6 +46,15 @@ after = \effect, transform ->
|
||||||
Ok a -> transform a
|
Ok a -> transform a
|
||||||
Err err -> Task.fail err
|
Err err -> Task.fail err
|
||||||
|
|
||||||
|
attempt : Task a b, (Result a b -> Task c d) -> Task c d
|
||||||
|
attempt = \task, transform ->
|
||||||
|
Effect.after
|
||||||
|
task
|
||||||
|
\result ->
|
||||||
|
when result is
|
||||||
|
Ok ok -> transform (Ok ok)
|
||||||
|
Err err -> transform (Err err)
|
||||||
|
|
||||||
map : Task a err, (a -> b) -> Task b err
|
map : Task a err, (a -> b) -> Task b err
|
||||||
map = \effect, transform ->
|
map = \effect, transform ->
|
||||||
Effect.map
|
Effect.map
|
||||||
|
@ -61,7 +70,7 @@ putLine = \line -> Effect.map (Effect.putLine line) (\_ -> Ok {})
|
||||||
putInt : I64 -> Task {} *
|
putInt : I64 -> Task {} *
|
||||||
putInt = \line -> Effect.map (Effect.putInt line) (\_ -> Ok {})
|
putInt = \line -> Effect.map (Effect.putInt line) (\_ -> Ok {})
|
||||||
|
|
||||||
getInt : Task I64 []
|
getInt : Task I64 [GetIntError]
|
||||||
getInt =
|
getInt =
|
||||||
Effect.after
|
Effect.after
|
||||||
Effect.getInt
|
Effect.getInt
|
||||||
|
@ -69,10 +78,11 @@ getInt =
|
||||||
if
|
if
|
||||||
isError
|
isError
|
||||||
then
|
then
|
||||||
|
# TODO
|
||||||
# when errorCode is
|
# when errorCode is
|
||||||
# # A -> Task.fail InvalidCharacter
|
# # A -> Task.fail InvalidCharacter
|
||||||
# # B -> Task.fail IOError
|
# # B -> Task.fail IOError
|
||||||
# _ ->
|
# _ ->
|
||||||
Task.succeed -1
|
Task.fail GetIntError
|
||||||
else
|
else
|
||||||
Task.succeed value
|
Task.succeed value
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue