gpt4 book ai didi

haskell - 表达式 fmap 的求值 (*3) (+5) 1

转载 作者:行者123 更新时间:2023-12-03 05:54:12 24 4
gpt4 key购买 nike

您能帮我验证以下 Haskell 表达式的计算结果吗: fmap (*3) (+5) 1 ?我尤其在正确解析 fmap x y z 方面遇到困难。

谢谢

我的试用:

fmap (*3) (+5) 1 -- nothing to do 1 is 1
=> (fmap (*3)) (+5) 1 -- function application infixl 10
=> ((fmap (*3)) (+5)) 1 -- function application infixl 10
=> ((fmap (*3) (+5)) 1 -- (f (x) y) equivalent to (f x y)
=> ((*3) . (+5)) 1 -- fmap f g = f.g;
=> (*3) ((+5) 1) -- (f.g) x = f (g x)
=> (*3) 6
=> 18

最佳答案

您所展示的推理似乎正确

我们可以对 Haskell 是如何做到的做出更严格的回答。首先,类型检查器将被激活。

Haskell 看到表达式

((fmap (*3)) (+5)) 1

所以首先它会进行一些类型推理:

fmap :: Functor f => (a -> b) -> f a -> f b
(*3) :: Num c => c -> c
(+5) :: Num d => d -> d
1 :: Num e => e

由于我们使用 (*3) 调用 fmap,这意味着 a -> b ~ c -> c,因此 a ~ b ~ c,所以我们得到:

fmap :: (Num a, Functor f) => (a -> a) -> f a -> f a
(*3) :: Num a => a -> a
(+5) :: Num d => d -> d
1 :: Num e => e

这意味着 fmap (*3) 的类型为 fmap (*3)::(Num a, Functor f) => f a -> f a。由于 (+5)::Num d => d -> d 是该函数的参数,因此我们看到 f a ~ d -> d。或者采用更规范的形式:f a ~ (->) d d。所以这意味着 f ~ (-> d)a ~ d。这是成立的,因为有 (->) aFunctor:

instance Functor ((->) a) where
fmap = (.)

所以我们现在有类型:

fmap :: Num a => (a -> a) -> (a -> a) -> (a -> a)
fmap :: Num a => (a -> a) -> (a -> a) -> a -> a
fmap = (.)
(*3) :: Num a => a -> a
(+5) :: Num a => a -> a
1 :: Num e -> e

这意味着 fmap (*3) (+5) 的类型为 (->) a a。我们用1调用这个函数,所以这意味着e ~ a,所以:

fmap :: Num a => (a -> a) -> (a -> a) -> a -> a
fmap = (.)
(*3) :: Num a => a -> a
(+5) :: Num a => a -> a
1 :: Num a -> a

现在我们对函数进行类型检查,我们得出的结论是fmap = (.),所以我们基本上编写了:

(((.) (*3)) (+5)) 1

现在,如果我们想评估这一点,我们会得到:

   (((.) (*3)) (+5)) 1
-> (*3) ((+5) 1)
-> (*3) 6
-> 18

关于haskell - 表达式 fmap 的求值 (*3) (+5) 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49212318/

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