小编Bri*_*ian的帖子

通过Free Monad和Coproduct自动选择译员

我正在使用app架构和haskell中的免费monad.我已经把它弄下来,除了如何将我的"指令"提升到我的副产品的正确插槽中而没有明确地给出完整的左/右路径.

这是我一直在使用的haskell示例:https://gist.github.com/aaronlevin/87465696ba6c554bc72b#file-reasonable-hs

在这里,为了将类型注入到副产品中,我们明确提到了路径.

例如:

Program :: Coproduct Interaction (Coproduct Auth Logging) a
logC :: (Functor f) => (forall a. Logging a -> f a) -> String -> Free f ()

logger :: String -> Free Program ()
logger = logC (Program . Coproduct . Right . Coproduct . Right)
Run Code Online (Sandbox Code Playgroud)

在这里,记录器必须手动放入副产品的右侧插槽中 Coproduct . Right . Coproduct . Right

Runar在scala中的讨论使用隐式类型转换和Inject类型类来实现这个结果:https://gist.github.com/runarorama/a8fab38e473fafa0921d#file-gistfile1-scala-L119

简而言之,我想知道在haskell中是否有办法做到这一点.

monads haskell scala

21
推荐指数
1
解决办法
569
查看次数

为什么applicative functor有副作用,但是functor不能?

我觉得这个问题很傻,但是我已经想到了一段时间,我找不到任何答案.

所以问题是:为什么应用仿函数有副作用,但仿函数不能?

也许他们可以而且我从未注意到......?

monads haskell side-effects applicative

16
推荐指数
2
解决办法
1888
查看次数

了解Data.Functor.Constant构造函数和应用法则

我对Data.Functor.Constant的类型构造函数以及它如何与applicative一起使用感到困惑.


首先是构造函数:

当我检查的类型 Constant :: a -> Constant a b

我看到它需要一个a,但返回一个Constant a b

b来自哪里,为什么存在?


其次,我正在努力应用:

我理解Constant需要将Monoid作为Applicative实例.

它必须遵守的法律是: pure id <*> Constant x = x

我以为那是一样的: Constant id <*> Constant x = x

但我想我错了,因为以下代码清楚地表明了纯粹的行为.

:t pure id <*> Constant "hello" // Constant [Char] b

:t Constant id <*> Constant "hello" // Couldn't match expected type `a0 -> a0' with actual type `[Char]'

:t pure id <*> Constant reverse //  Constant ([a] -> [a]) b

:t Constant …
Run Code Online (Sandbox Code Playgroud)

haskell constants functor applicative monoids

15
推荐指数
1
解决办法
1009
查看次数

Snap Framework:如何在处理程序中运行IO

这可能是一个简单的问题,我在SO上看过类似的问题,但我仍然陷入困境.

我正在尝试进行HTTP调用以获取另一个博客的内容并将其显示在我的页面上.这比任何事情都更像是一种学习练习.

这是我的经纪人

blog :: App1Handler ()
blog = do
  contents <- Requester.getUrl "http://someblog.com/"
  heistLocal (bindString "contents" contents) . render $ "blog"
Run Code Online (Sandbox Code Playgroud)

Requester.getUrl具有签名getUrl :: String - > IO T.Text

我得到的错误是

src/Main.hs:50:15:
无法匹配期望的类型Handler App1 App1 t0' with actual typeIO T.Text'
在'getUrl'调用的返回类型中
'do'块的stmt:
contents < - getUrl"http:/ /someblog.com/"
在表达式中:
do {contents < - getUrl"http://someblog.com/";
heistLocal(bindString"contents"内容).渲染$"博客"}

从我收集的内容来看,我被困在IO monad中,它想要Handler App1 App1 t0类型.我试过在某些地方坚持使用liftIO,但我对此非常困惑.

谁能指出我正确的方向?

谢谢!

monads haskell haskell-snap-framework

2
推荐指数
1
解决办法
442
查看次数