首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从(a -> b -> c)和(线s e m b b)构建a (Wire S E M c)

从(a -> b -> c)和(线s e m b b)构建a (Wire S E M c)
EN

Stack Overflow用户
提问于 2014-12-21 06:53:45
回答 3查看 78关注 0票数 0

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

代码语言:javascript
复制
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的线路。

我觉得应该很容易,但我运气不好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-23 17:38:37

另一种选择是使用应用程序语法,它甚至更干净,imo。

代码语言:javascript
复制
w2 :: Monad m => Wire s e m Int String
w2 = f <$> id <*> w

这概括为

代码语言:javascript
复制
(Category cat, Applicative (cat a)) => (a -> b -> c) -> cat a b -> cat a c

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

票数 2
EN

Stack Overflow用户

发布于 2014-12-21 08:11:59

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

代码语言:javascript
复制
{-# 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实例所需要的。

如果您想去掉箭头符号,可以将上面的内容重写为

代码语言:javascript
复制
w2 :: (Monad m) => Wire s e m Int String
w2 = arr (uncurry f) . (id &&& w)

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

代码语言:javascript
复制
-- 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
票数 2
EN

Stack Overflow用户

发布于 2014-12-21 14:07:52

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27587354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档