gpt4 book ai didi

haskell - 状态应用实例-数据流顺序

转载 作者:行者123 更新时间:2023-12-02 10:21:54 25 4
gpt4 key购买 nike

我正在尝试为这种类型实现 Applicative 实例:

newtype State s a = State {runState :: s -> (a, s)}

我对 (<*>) 函数有一些不同的想法。我想到的一种实现方法是

(<*>) :: State s (a -> b) -> State s a -> State s b
State f <*> State s = State $ do
(fa, fs) <- f
let (sa, ss) = s fs
return (fa sa, ss)

或者

(<*>) :: State s (a -> b) -> State s a -> State s b
State f <*> State s = State $ do
(sa, ss) <- s
let (fa, fs) = f ss
return (fa sa, fs)

哪一个(或者甚至其中任何一个)是正确的,为什么?

它们都进行类型检查,并且仅在“状态”转换顺序上有所不同。我找不到任何充分的理由来选择其中一个而不是另一个......

最佳答案

首先,我建议不要使用(monadic!)do 语法来定义这样的应用实例,因为它会掩盖正在发生的事情。以下是仅使用标准函数语法的定义:

State f <*> State s = State $ \q
-> let (fa, fs) = f q
(sa, ss) = s fs
in (fa sa, ss)

State f <*> State s = State $ \q
-> let (fa, fs) = f ss
(sa, ss) = s q
in (fa sa, fs)

这也更清楚地表明,应用实例中实际上没有任何内在的求值顺序(与 monad 实例不同)。

关于haskell - 状态应用实例-数据流顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45154169/

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