- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Haskell 具有函数 join
,它“运行”单子(monad)内部的单子(monad)操作:
join :: Monad m => m (m a) -> m a
join m = m >>= \f -> f
我们可以用一个参数为一元函数编写一个类似的函数:
join1 :: Monad m => m (a -> m b) -> (a -> m b)
join1 m arg1 = m >>= \f -> f arg1
对于两个参数:
join2 :: Monad m => m (a -> b -> m c) -> (a -> b -> m c)
join2 m arg1 arg2 = m >>= \f -> f arg1 arg2
是否可以编写一个通用函数joinN
,它可以处理具有 N 个参数的一元函数?
最佳答案
如果你真的愿意的话,你可以做一些相当丑陋的事情。
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE UndecidableInstances #-}
import Control.Monad (join, liftM)
class Joinable m z | z -> m where
joins :: m z -> z
instance Monad m => Joinable m (m a) where
joins = join
instance (Monad m, Joinable m z) => Joinable m (r -> z) where
joins m r = joins (liftM ($ r) m)
但是,正如您所看到的,这依赖于一些不稳定的类型类魔法(特别是令人羡慕的UndecidableInstances
)。编写所有实例 join1
...join10
并直接导出它们可能会更好(虽然看起来很丑)。这也是 base
库中建立的模式。
值得注意的是,在这种制度下推理不会很好地发挥作用。例如
λ> joins (return (\a b -> return (a + b))) 1 2
Overlapping instances for Joinable ((->) t0) (t0 -> t0 -> IO t0)
arising from a use of ‘joins’
Matching instances:
instance Monad m => Joinable m (m a)
-- Defined at /Users/tel/tmp/ASD.hs:11:10
instance (Monad m, Joinable m z) => Joinable m (r -> z)
-- Defined at /Users/tel/tmp/ASD.hs:14:10
但是如果我们给我们的参数一个明确的类型
λ> let {q :: IO (Int -> Int -> IO Int); q = return (\a b -> return (a + b))}
那么它仍然可以像我们希望的那样工作
λ> joins q 1 2
3
出现这种情况是因为仅使用类型类就很难指示您是要对函数链的最终返回类型中的 monad m
进行操作,还是对 monad (->) 进行操作r
是函数链本身。
关于haskell - 从 monad 中取出 monadic 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28203347/
我有这样的数据。 (a,b,c,d) (g,b,v,n) (n,h,l,o) (,,,) (,,,) (,,,) (,,,) 我想取出空袋子。 所需的输出 (a,b,c,d) (g,b,v,n) (n
我是编程新手,我有一堆 CSV 文件,每个文件大约有 50 到 60 行。在未指定数量的行之后,第二列中有一个名为“NAME”的字符串。我想获取“NAME”之后第二列中的所有内容并将其打印到文本文件中
有没有办法在 linq 中删除以下代码中的 foreach 并产生相同的输出? DropDownList ddl = new DropDownList(); foreach (Data
注意-可以使用UIViewControllerAnimatedTransitioning https://developer.apple.com/library/ios/documentation/u
因此,我开始使用 Swift 为网站构建应用程序。主要目标是拥有一个可以接收通知(来自网站的 JSON)并可以显示网站所有功能的 iOS 应用程序。所以我可以从应用程序登录并注册到我的数据库,但问题是
我希望直接使用 ALAssetsLibrary 和 ALAsset 以 NSData 对象的形式提取图像。 使用 NSURL,我按以下方式取出图像。 NSURL *referenceURL =newU
我是一名优秀的程序员,十分优秀!