0

簡単な例として、私はこれを持っています。

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 から String へのワイヤを作成できるようにしたいと考えています。

簡単だと思いますが、運がありません。

4

3 に答える 3

2

元の入力を分割し、と の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

さて、Netwire についての最初のことはわかりませんが、そのMonad m制約が存在するのは、 のArrowインスタンスに必要だからですWire s e m

アロー表記を取り除きたい場合は、上記を次のように書き換えることができます。

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-12-21T08:11:59.670 に答える
1

私が思いついた別の解決策は

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
于 2014-12-21T14:07:52.743 に答える