【问题标题】:Build a (Wire s e m a c) from (a -> b -> c) and (Wire s e m a b)从 (a -> b -> c) 和 (Wire s e m a b) 构建 (Wire s e m a c)
【发布时间】:2015-02-19 15:31:53
【问题描述】:

作为一个简单的例子,我有这个。

import Prelude hiding ((.))
import FRP.Netwire
import Control.Wire

f :: Int -> Char -> String
f = replicate

w :: => Wire s e m Int Char
w = mkSF_ fromInt
    where
        fromInt :: Int -> Char
        fromInt 1 = 'a'
        fromInt 2 = 'b'
        fromInt _ = '_'

w2 :: Wire s e m Int String
w2 = undefined -- This is where I get stuck

我希望能够创建一条从 Int 到 Strings 的连线。

我认为这应该很容易,但我没有运气。

【问题讨论】:

    标签: haskell netwire


    【解决方案1】:

    另一种选择是使用应用语法,它更简洁,imo

    w2 :: Monad m => Wire s e m Int String
    w2 = f <$> id <*> w
    

    这概括为

    (Category cat, Applicative (cat a)) => (a -> b -> c) -> cat a b -> cat a c
    

    请注意,每个Arrow 都会产生上述约束。

    【讨论】:

      【解决方案2】:

      我想出的另一个解决方案是

      w2 :: Monad m => Wire s e m Int String
      w2 = liftA2 ($) (mkSF_ f) w
      -- or w2 = liftA2 ($) (arr f) w
      -- or w2 = arr f <*> w
      

      【讨论】:

        【解决方案3】:

        您需要拆分原始的Int 输入并将其扇出到warr f。解释它的最简单方法是使用箭头符号:

        {-# LANGUAGE Arrows #-}
        w2 :: (Monad m) => Wire s e m Int String
        w2 = proc n -> do
            c <- w -< n
            returnA -< f n c
        

        现在,我不知道关于 Netwire 的第一件事,但存在 Monad m 约束,因为 Wire s e mArrow 实例需要它。

        如果要去掉箭头符号,上面可以改写为

        w2 :: (Monad m) => Wire s e m Int String
        w2 = arr (uncurry f) . (id &&& w)
        

        当然,您可以将这个概念概括为这个抽象:

        -- I want to write (Arrow (~>)) => (a -> b -> c) -> (a ~> b) -> (a ~> c)!
        -- Damn you TypeOperators!
        arr2 :: (Arrow arr) => (a -> b -> c) -> arr a b -> arr a c
        arr2 f arr = proc x -> do
            y <- arr -< x
            returnA -< f x y
        

        【讨论】:

          猜你喜欢
          • 2014-03-23
          • 1970-01-01
          • 2019-07-14
          • 2012-01-27
          • 2015-01-31
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多