gpt4 book ai didi

haskell - 功能性 react 香蕉型困惑

转载 作者:行者123 更新时间:2023-12-02 15:22:32 26 4
gpt4 key购买 nike

Heinrich Apfelmus慷慨地插话this问题。我曾考虑过使用 accumB作为解决方案,但认为会出现类型错误。无论如何,在尝试了他的建议之后,我确实收到了类型错误。

let bGameState :: Behavior t GameState
bGameState = accumB initialGS $ updateGS <$ eInput

yields the error

Couldn't match expected type `GameState'
with actual type `PlayerCommand'
Expected type: GameState -> GameState
Actual type: PlayerCommand -> GameState -> GameState
In the first argument of `(<$)', namely `updateGS'
In the second argument of `($)', namely `updateGS <$ eInput'

所以我学习了(<$) ,并搞乱了部分应用。看了他建议的例子。我做得越多,我就越认为上面的代码应该能够工作,但我很困惑为什么它不起作用。

这就是我认为应该发生的事情:

(<$)类型为(<$) :: a -> f b -> f a

并且 updateGS 的类型为 updateGS :: PlayerCommand -> GameState -> GameState

eInput类型为Event t PlayerCommand

那么不应该updateGS <$ eInput产量

Event t (GameState -> GameState)

我的推理在某个地方有缺陷,有人可以指出哪里吗?

更新:当我尝试使用 (<$>) 时我收到以下错误

大纲.hs:158:21:

Could not deduce (t ~ t1)
from the context (Frameworks t)
bound by a type expected by the context:
Frameworks t => Moment t ()
at outline.hs:(153,42)-(159,93)
`t' is a rigid type variable bound by
a type expected by the context: Frameworks t => Moment t ()
at outline.hs:153:42
`t1' is a rigid type variable bound by
the type signature for bGameState :: Behavior t1 GameState
at outline.hs:158:8
Expected type: Behavior t1 GameState
Actual type: Behavior t GameState
In the expression: accumB initialGS $ updateGS <$> eInput
In an equation for `bGameState':
bGameState = accumB initialGS $ updateGS <$> eInput

作为引用,这是整个函数

makeNetworkDescription :: AddHandler PlayerCommand -> IO EventNetwork
makeNetworkDescription addCommandEvent = compile $ do
eInput <- fromAddHandler addCommandEvent
let bCommand = stepper Null eInput
eCommandChanged <- changes bCommand
let bGameState :: Behavior t GameState
bGameState = accumB initialGS $ updateGS <$> eInput
reactimate $ (\n -> appendFile "output.txt" ("Command is " ++ show n)) <$>
eCommandChanged

最佳答案

代码有什么问题

您应该使用<$> ,不是<$ .

  • <$> ,又名 fmap将函数应用于右侧事件的值,这就是您在本例中尝试执行的操作。
  • <$ 用左侧事件的值替换右侧事件的值,为您提供一个与原始事件同时发生的事件,但始终包含相同的值。

    注:x <$ econst x <$> e 相同.

为什么你的推理是错误的

我们正在尝试确定 updateGS <$ eInput 的类型其中子项的类型是:

(<$)     :: a -> f b -> f a
updateGS :: PlayerCommand -> GameState -> GameState
eInput :: Event t PlayerCommand

现在想想:什么类型必须 a , bf被实例化为?

  1. updateGS<$ 的第一个参数其类型为 a ,我们必须有

    a ~ PlayerCommand -> GameState -> GameState
  2. 同样,eInput<$ 的第二个参数其类型为 f b ,所以

    f b ~ Event t PlayerCommand

    在左侧键入 application Associates,因此 Event t PlayerCommand(Event t) PlayerCommand 相同。因此我们可以确定

    f ~ Event t
    b ~ PlayerCommand
  3. 将结果的类型放在一起,f a ,我们看到

    f a ~ Event t (PlayerCommand -> GameState -> GameState)     

因此,updateGS <$ eInput :: Event t (PlayerCommand -> GameState -> GameState) ,这解释了类型错误。

关于haskell - 功能性 react 香蕉型困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073806/

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