- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我确定我一定遗漏了什么。
我是 Haskell 的新手,曲线非常陡峭。在我的玩具项目中,我真的很想使用 State monad 来避免在任何地方传递一千个参数。我无法理解如何将 State monad 从 IO 传递到纯代码中。概念上是这样的(除了 StateT 而不是 ExceptT):
import Control.Monad.Except
import Control.Monad.Identity
type PlayM = Except String
type PlayMIO = ExceptT String IO
puree :: String -> PlayM String
puree = return . ("bb"++)
impuree :: String -> PlayMIO String
impuree s = do
a <- return $ runIdentity $ runExceptT $ puree s
return $ "aa" ++ a
main = do
runExceptT $ impuree "foo"
putStrLn "hi"
play.hs:15:20:
Couldn't match expected type ‘[Char]’
with actual type ‘Either String String’
In the second argument of ‘(++)’, namely ‘a’
In the second argument of ‘($)’, namely ‘"aa" ++ a’
最佳答案
你很接近。让我们遵循带有类型孔的类型(_
s):
impuree :: String -> PlayMIO String
impuree s = do
a <- _ . runIdentity . runExceptT $ puree s
return $ "aa" ++ a
Test.hs:15:8:
Found hole ‘_’
with type: m0 (Either String String) -> ExceptT String IO [Char]
Where: ‘m0’ is an ambiguous type variable
Relevant bindings include
s :: String (bound at Test.hs:13:9)
impuree :: String -> PlayMIO String (bound at Test.hs:13:1)
In the first argument of ‘(.)’, namely ‘_’
In the expression: _ . return . runIdentity . runExceptT
In a stmt of a 'do' block:
a <- _ . return . runIdentity . runExceptT $ puree s
m (Either e b)
的东西。成
ExceptT e m b
:
ExceptT :: m (Either e b) -> ExceptT e m b
impuree :: String -> PlayMIO String
impuree s = do
a <- ExceptT . return . runIdentity . runExceptT $ puree s
return $ "aa" ++ a
ExceptT . f . runExceptT
用函数抽象出来
mapExceptT :: (m (Either e a) -> n (Either e' b)) -> ExceptT e m a -> ExceptT e' n b
m
是
Identity
和
n
是
IO
.使用这个,我们得到:
impuree :: String -> PlayMIO String
impuree s = do
a <- mapExceptT (return . runIdentity) $ puree s
return $ "aa" ++ a
mmorph
的包。这使得与 monad 态射(从一个 monad 到另一个 monad 的转换)一起工作变得更好。这个包有一个功能
generalize :: Monad m => Identity a -> m a
我们可以使用:
impuree :: String -> PlayMIO String
impuree s = do
a <- mapExceptT generalize $ puree s
return $ "aa" ++ a
mmorph
,我们不妨使用更一般的形式:
impuree :: String -> PlayMIO String
impuree s = do
a <- hoist generalize $ puree s
return $ "aa" ++ a
hoist
概括
mapExceptT
对于任何类似 monad 转换器的东西,您可以将 monad 态射应用于底层 monad:
hoist :: (MFunctor t, Monad m) => (forall a. m a -> n a) -> t m b -> t n b
关于haskell - 将 StateT 移入和移出 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32106814/
我目前正在开发一款炸弹人游戏 :D。老实说,它进行得非常好。我现在正在创建我的 map 编辑器,但我想知道是否可以使用输出流在 .txt 文件中移动?我已经学会了如何使用缓冲区(字符串)读取 whil
基本上,标题...如果没有 QThread(或者它只是被评论)我得到以下结果: LOG> Log working! LOG> PRODUCER: sent resource address: 2998
我有 3 个 View ,并希望将它们集成到一个 View 中,以便它们成为这一 View 中的子文件夹。 我怎样才能做到这一点?还是我必须制作一个 View ,然后再次手动添加和配置这些 View
void rotate( unsigned long mask[], int rotateCnt ); 此函数将当前 64 位掩码 (mask[]) 旋转 rotateCnt 位。如果rotateCn
这是一个非常高级的架构问题。为什么还没有将 JVM 移入linux 内核,它可以更高效(包括即时编译代码)。 我知道这对最小内核的粉丝来说是可恶的,但 Linux 不是那些操作系统之一,它似乎。可以通
我的 Internet 连接速度很慢,我试图避免下载以前的 XCode 文档集和 SDK。 我刚刚安装了 XCode 4.5,发现它们没有包含任何 iOS 版本的文档集。也只有适用于 iOS 6 的
当单击另一个 div 时,如何将一个 div(应该在最右侧的 View 之外)移动到页面上?在下面的代码笔中,我希望绿色 div (id = "three") 离开页面,当单击红色 div (id =
当将 std::unique_ptr 移动到 lambda 中时,无法在其上调用 reset(),因为它似乎是 const : error C2662: void std::unique_ptr>::
我正在将数据库转储到 SQL 转储中: docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -ppassword' > all
我是一名优秀的程序员,十分优秀!