我一直试图控制箭头,因为它们是大多数FRP实施的基础.我想我理解了它的基本思想 - 它们与monad有关但在每个绑定操作符中存储静态信息,因此您可以遍历一系列箭头并查看静态信息,而无需评估整个箭头.
但是,在我们开始讨论第一,第二和交换时,我迷路了.2元组与箭头有什么关系?教程提供了元组的东西,好像它是明显的下一步,但我并没有真正看到连接.
就此而言,箭头语法直观地意味着什么?
我写了一些玩具代码来玩Arrows的概念.我想看看我是否可以编写一个编码有状态函数概念的箭头 - 在不同的调用之后给出不同的值.
{-# LANGUAGE Arrows#-}
module StatefulFunc where
import Control.Category
import Control.Arrow
newtype StatefulFunc a b = SF { unSF :: a -> (StatefulFunc a b, b) }
idSF :: StatefulFunc a a
idSF = SF $ \a -> (idSF, a)
dotSF :: StatefulFunc b c -> StatefulFunc a b -> StatefulFunc a c
dotSF f g = SF $ \a ->
let (g', b) = unSF g a
(f', c) = unSF f b
in (dotSF f' g', …Run Code Online (Sandbox Code Playgroud) 我试图理解箭头并创建以下示例:
{-# LANGUAGE Arrows #-}
module Main where
import Control.Arrow
import Control.Monad
import qualified Control.Category as Cat
import Data.List
import Data.Maybe
data IOArrow a b = IOArrow { runIOArrow :: a -> IO b }
instance Cat.Category IOArrow where
id = IOArrow return
IOArrow f . IOArrow g = IOArrow $ f <=< g
instance Arrow IOArrow where
arr f = IOArrow $ return . f
first (IOArrow f) = IOArrow $ \(a, c) -> do
x <- f a …Run Code Online (Sandbox Code Playgroud)