From c4853092e7ed21fc1f605c237e4b595a04e9e19a Mon Sep 17 00:00:00 2001 From: Vesa Karvonen Date: Wed, 7 Sep 2016 09:14:35 +0300 Subject: [PATCH 1/3] `async.Bind (expr, async.Return)` -> `expr` `async.Bind (expr, async.Return)` is equivalent to `expr` (Monad laws). Note that `fun s -> f () s` is not necessarily equivalent to `f ()` in F#. --- src/Freya.Core/Core.fs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Freya.Core/Core.fs b/src/Freya.Core/Core.fs index 601cf7e..729f92c 100644 --- a/src/Freya.Core/Core.fs +++ b/src/Freya.Core/Core.fs @@ -212,8 +212,7 @@ module Freya = let delay (f: unit -> Freya<'a>) : Freya<'a> = fun s -> - async.Bind (f () s, fun (a, s) -> - async.Return (a, s)) + f () s let init (a: 'a) : Freya<'a> = fun s -> From 7d9b635f4a25558ab2a567062af62567502718eb Mon Sep 17 00:00:00 2001 From: Vesa Karvonen Date: Wed, 7 Sep 2016 09:15:14 +0300 Subject: [PATCH 2/3] `Job.bind Job.result expr` -> `expr` `Job.bind Job.result expr` is equivalent to `expr` (Monad laws). Note that `fun s -> f () s` is not necessarily equivalent to `f ()` in F#. --- src/Freya.Core/Core.fs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Freya.Core/Core.fs b/src/Freya.Core/Core.fs index 729f92c..8514ba3 100644 --- a/src/Freya.Core/Core.fs +++ b/src/Freya.Core/Core.fs @@ -173,8 +173,7 @@ module Freya = let delay (f: unit -> Freya<'a>) : Freya<'a> = fun s -> - Job.bind (fun (a, s) -> - Job.result (a, s)) (f () s) + f () s let init (a: 'a) : Freya<'a> = fun s -> From ae75a9cbc7221455cbc1c57977ec9409dce3c22a Mon Sep 17 00:00:00 2001 From: Vesa Karvonen Date: Wed, 7 Sep 2016 09:16:00 +0300 Subject: [PATCH 3/3] `Job.bind (_ -> Job.result _)` -> `Job.map (_->_)` `Job.bind (fun p -> Job.result e2) e1` is equivalent to `Job.map (fun p -> e2) e1`. --- src/Freya.Core/Core.fs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Freya.Core/Core.fs b/src/Freya.Core/Core.fs index 8514ba3..9081174 100644 --- a/src/Freya.Core/Core.fs +++ b/src/Freya.Core/Core.fs @@ -158,8 +158,8 @@ module Freya = let apply (m: Freya<'a>, f: Freya<'a -> 'b>) : Freya<'b> = fun s -> Job.bind (fun (f, s) -> - Job.bind (fun (a, s) -> - Job.result (f a, s)) (m s)) (f s) + Job.map (fun (a, s) -> + (f a, s)) (m s)) (f s) let bind (m: Freya<'a>, f: 'a -> Freya<'b>) : Freya<'b> = fun s -> @@ -184,8 +184,8 @@ module Freya = let map (m: Freya<'a>, f: 'a -> 'b) : Freya<'b> = fun s -> - Job.bind (fun (a, s) -> - Job.result (f a, s)) (m s) + Job.map (fun (a, s) -> + (f a, s)) (m s) let zero () : Freya = fun s -> @@ -250,14 +250,14 @@ module Freya = let fromAsync (a: 'a, f: 'a -> Async<'b>) : Freya<'b> = fun s -> - Job.bind (fun (b) -> - Job.result (b, s)) (Job.fromAsync (f a)) + Job.map (fun b -> + (b, s)) (Job.fromAsync (f a)) let map2 (f: 'a -> 'b -> 'c, m1: Freya<'a>, m2: Freya<'b>) : Freya<'c> = fun s -> Job.bind (fun (a, s) -> - Job.bind (fun (b, s)-> - Job.result (f a b, s)) (m2 s)) (m1 s) + Job.map (fun (b, s)-> + (f a b, s)) (m2 s)) (m1 s) #else @@ -292,8 +292,8 @@ module Freya = | Some memo -> Job.result (memo, s) | _ -> - Job.bind (fun (memo, s) -> - Job.result (memo, Aether.Optic.set memo_ (Some memo) s)) (m s) + Job.map (fun (memo, s) -> + (memo, Aether.Optic.set memo_ (Some memo) s)) (m s) #else