Haskell 从(a->;b->;c)和(s e m a b)生成a(导线s e m a c)

Haskell 从(a->;b->;c)和(s e m a b)生成a(导线s e m a c),haskell,netwire,Haskell,Netwire,作为一个简单的例子,我有这个 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'

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

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到字符串的连接


我认为这应该很容易,但我运气不好。

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

{-# LANGUAGE Arrows #-}
w2 :: (Monad m) => Wire s e m Int String
w2 = proc n -> do
    c <- w -< n
    returnA -< f n c
当然,您可以将概念概括为以下抽象:

-- 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
——我想写(箭头(~>)=>(a->b->c)->(a~>b)->(a~>c)!
--该死的打字员!
arr2::(箭头arr)=>(a->b->c)->arr a b->arr a c
arr2 f arr=proc x->do

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

{-# LANGUAGE Arrows #-}
w2 :: (Monad m) => Wire s e m Int String
w2 = proc n -> do
    c <- w -< n
    returnA -< f n c
当然,您可以将概念概括为以下抽象:

-- 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
——我想写(箭头(~>)=>(a->b->c)->(a~>b)->(a~>c)!
--该死的打字员!
arr2::(箭头arr)=>(a->b->c)->arr a b->arr a c
arr2 f arr=proc x->do

我想出的另一个解决办法是

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
w2::Monad m=>Wire s e m Int String
w2=liftA2($)(mkSF_uf)w
--或w2=liftA2($)(arr f)w
--或w2=arr f w

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

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
w2::Monad m=>Wire s e m Int String
w2=liftA2($)(mkSF_uf)w
--或w2=liftA2($)(arr f)w
--或w2=arr f w

另一个选择是使用应用程序语法,这在我看来更简洁

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

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

另一个选项是使用更简洁的应用程序语法

w2 :: Monad m => Wire s e m Int String
w2 = f <$> id <*> w
请注意,每个
箭头都会产生上述约束