在构建 Haskell Reader 箭头时,"ask" 的哪个实现摆脱了无关参数?
When building a Haskell Reader Arrow, what implementation of "ask" gets rid of the extraneous parameter?
昨天刚开始使用 Arrows。作为练习,我决定尝试构建一个类似于 Control.Monad.Reader.Reader
的“Reader 箭头”。我将其命名为 EA
(“环境箭头”)。问题跟在代码之后。
import Prelude hiding ((.), id)
import Control.Category
import Control.Arrow
import qualified Data.Bifunctor as BiF
newtype EA r a b = EA { runEA :: r -> a -> b }
instance Arrow (EA r) where
arr f = EA $ const f
first (EA f) = EA $ BiF.first . f
second (EA f) = EA $ BiF.second . f
instance Category (EA r) where
id = arr id
(EA b) . (EA a) = EA $ \r -> b r . a r
ask :: EA r a r
ask = EA const
test :: EA Int Int Int
test = proc i -> do
f <- ask -< i -- How can I build an "ask" that doesn't need a parameter?
returnA -< f
如何构建 ask
以便它可以使用 proc
表示法但不需要参数?换句话说,我想说 f <- ask
而不是 f <- ask -< i
,因为从未使用过该参数。
做不到。 f <- ask
在箭头表示法中甚至无效 syntax。每个箭头都必须“应用于”proc
块中的某个参数。
昨天刚开始使用 Arrows。作为练习,我决定尝试构建一个类似于 Control.Monad.Reader.Reader
的“Reader 箭头”。我将其命名为 EA
(“环境箭头”)。问题跟在代码之后。
import Prelude hiding ((.), id)
import Control.Category
import Control.Arrow
import qualified Data.Bifunctor as BiF
newtype EA r a b = EA { runEA :: r -> a -> b }
instance Arrow (EA r) where
arr f = EA $ const f
first (EA f) = EA $ BiF.first . f
second (EA f) = EA $ BiF.second . f
instance Category (EA r) where
id = arr id
(EA b) . (EA a) = EA $ \r -> b r . a r
ask :: EA r a r
ask = EA const
test :: EA Int Int Int
test = proc i -> do
f <- ask -< i -- How can I build an "ask" that doesn't need a parameter?
returnA -< f
如何构建 ask
以便它可以使用 proc
表示法但不需要参数?换句话说,我想说 f <- ask
而不是 f <- ask -< i
,因为从未使用过该参数。
做不到。 f <- ask
在箭头表示法中甚至无效 syntax。每个箭头都必须“应用于”proc
块中的某个参数。