Haskell F# 中的应用函数
Haskell Applicative Functor in F#
在Haskell中我们可以这样写代码:
// (<*>) :: Applicative f => f (a -> b) -> f a -> f b
// const :: a -> b -> a
// id :: b -> b
let id = const <*> const
如何在 F# 中做同样的事情?
我试着写这样的代码,但它不一样
let ( <*> ) f v =
match v with
| Some v' ->
match f with
| Some f' -> Some (f' v')
| _ -> None
| _ -> None
let cnst a _ = a
let id = cnst <*> cnst // but it seems impossible
let id' x = (Some (cnst x)) <*> (Some(cnst x x)) // it works
但在 Haskell id::b->b
中,在 F# id:'a->'a Option
我做错了什么?如何达到相同的结果?
PS:正如我对 Applicative 的了解,我们的值被包装在上下文中,就像 Functors 和函数也被包装在上下文中一样!
Some((+)3) and Some(2)
在这种情况下上下文是选项
而Applay
方法是这样的:
let Apply funInContext valInContext =
match funInContext with // unwrap function
| Some f ->
match valInContext with // unwrap value
| Some v -> Some(f v) // applay function on value and wrap it
| _ -> None
| _ -> None
我对你的代码试图实现的目标感到有点困惑,因为它的类型是
(a -> Maybe b) -> Maybe a -> Maybe b
这是我们通常注入 Maybe
/option
的 monad 结构的绑定类型,但如果您尝试使用函数的应用实例,它就没有意义我们在 Haskell 中拥有。有两件事我们需要改变,第一是我们需要使用 functions 和 applicatives 以使代码实现想要的效果。那应该有类型
(a -> (b -> c)) -> (a -> b) -> (a -> c)
所以我们可以这样写
let ( <*> ) f x a = (f a) (x a)
现在如果我们步进原来的例子
(cnst <*> cnst) a = (cnst a) (cnst a)
= a
所以我们确实有 cnst <*> cnst = id
所需要的。
在Haskell中我们可以这样写代码:
// (<*>) :: Applicative f => f (a -> b) -> f a -> f b
// const :: a -> b -> a
// id :: b -> b
let id = const <*> const
如何在 F# 中做同样的事情?
我试着写这样的代码,但它不一样
let ( <*> ) f v =
match v with
| Some v' ->
match f with
| Some f' -> Some (f' v')
| _ -> None
| _ -> None
let cnst a _ = a
let id = cnst <*> cnst // but it seems impossible
let id' x = (Some (cnst x)) <*> (Some(cnst x x)) // it works
但在 Haskell id::b->b
中,在 F# id:'a->'a Option
我做错了什么?如何达到相同的结果?
PS:正如我对 Applicative 的了解,我们的值被包装在上下文中,就像 Functors 和函数也被包装在上下文中一样!
Some((+)3) and Some(2)
在这种情况下上下文是选项
而Applay
方法是这样的:
let Apply funInContext valInContext =
match funInContext with // unwrap function
| Some f ->
match valInContext with // unwrap value
| Some v -> Some(f v) // applay function on value and wrap it
| _ -> None
| _ -> None
我对你的代码试图实现的目标感到有点困惑,因为它的类型是
(a -> Maybe b) -> Maybe a -> Maybe b
这是我们通常注入 Maybe
/option
的 monad 结构的绑定类型,但如果您尝试使用函数的应用实例,它就没有意义我们在 Haskell 中拥有。有两件事我们需要改变,第一是我们需要使用 functions 和 applicatives 以使代码实现想要的效果。那应该有类型
(a -> (b -> c)) -> (a -> b) -> (a -> c)
所以我们可以这样写
let ( <*> ) f x a = (f a) (x a)
现在如果我们步进原来的例子
(cnst <*> cnst) a = (cnst a) (cnst a)
= a
所以我们确实有 cnst <*> cnst = id
所需要的。