gpt4 book ai didi

haskell - 如何使 Applicative 的实例成为某种数据类型

转载 作者:行者123 更新时间:2023-12-01 07:50:09 25 4
gpt4 key购买 nike

我正在阅读关于 Haskell 的 Graham Hutton 的书,并且不知道如何在练习的一部分中进行。练习说如下:

给定以下类型表达式

data Expr a = Var a | Val Int | Add (Expr a) (Expr a) deriving Show


包含某种类型 a 的变量,展示如何将这种类型变成 Functor、Applicative 和 Monad 类的实例。举例说明 >>=是什么意思这种类型的运算符确实如此。



我在定义 <*> 时遇到问题Applicative 的运算符。 <*>的类型是:
(<*>) :: Expr (a -> b) -> Expr a -> Expr b

我不明白如何 (Val n) <*> mx可能有用,因为理论上我需要提供一个 Expr b ,但我只有一个 Expr a并且没有要转换的函数( a -> b )。

我也不明白在 (Add l r) <*> mx 中该做什么案件。

这是我的实现。
instance Functor Expr where
--fmap :: (a -> b) -> Expr a -> Expr b
fmap g (Var x) = Var (g x)
fmap g (Val n) = Val n
fmap g (Add l r) = Add (fmap g l) (fmap g r)


instance Applicative Expr where
--pure :: a -> Expr a
pure = Var

-- <*> :: Expr (a -> b) -> Expr a -> Expr b
(Var g) <*> mx = fmap g mx
--(Val n) <*> mx = ???
--(Add l r) <*> mx = ???

instance Monad Expr where
-- (>>=) :: Expr a -> (a -> Expr b) -> Expr b
(Var x) >>= g = g x
(Val n) >>= g = Val n
(Add l r) >>= g = Add (l >>= g) (r >>= g)


expr = Add (Add (Var 'a') (Val 4)) (Var 'b')

最后,我对 monad 中的 >>= 有疑问。这个运算符的想法是做诸如替换变量之类的事情?喜欢:
expr >>= (\x -> if x == 'a' then Val 6 else Var x) >>= (\x -> if x == 'b' then Val 7 else Var x)

最佳答案

正如您正确指出的那样,在这种情况下:

(Val n) <*> mx = ???

你有:
Val n :: Expr (a -> b)
mx :: Expr a

你需要生产一个 Expr b .你还记得这个案例吗:
fmap g (Val n) = ???

当你有:
g :: a -> b
Val n :: Expr a

你需要生产一个 Expr b ?您在那里找到了解决方案。

对于这种情况:
(Add l r) <*> mx

你有:
l :: Expr (a -> b)
r :: Expr (a -> b)
mx :: Expr a

你需要生产一个 Expr b .如果你有一些可以接受 l 的函数就好了和 mx并创建一个 Expr b .这样的函数,如果存在的话,可能会有签名:
someFunc :: Expr (a -> b) -> Expr a -> Expr b

当然,用 someFunc l mxsomeFunc r mx , 两种类型 Expr b ,只用一个就太可惜了。如果有某种方式 build Expr b来自两个 Expr b部分,那真的是蜜蜂的膝盖。

关于haskell - 如何使 Applicative 的实例成为某种数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58399453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com