标签: monads

对flatMap/Map转换的理解感到困惑

我似乎真的不了解Map和FlatMap.我无法理解的是for-comprehension是如何嵌套调用map和flatMap的.以下示例来自Scala中的Functional Programming

def bothMatch(pat:String,pat2:String,s:String):Option[Boolean] = for {
            f <- mkMatcher(pat)
            g <- mkMatcher(pat2)
 } yield f(s) && g(s)
Run Code Online (Sandbox Code Playgroud)

翻译成

def bothMatch(pat:String,pat2:String,s:String):Option[Boolean] = 
         mkMatcher(pat) flatMap (f => 
         mkMatcher(pat2) map (g => f(s) && g(s)))
Run Code Online (Sandbox Code Playgroud)

mkMatcher方法定义如下:

  def mkMatcher(pat:String):Option[String => Boolean] = 
             pattern(pat) map (p => (s:String) => p.matcher(s).matches)
Run Code Online (Sandbox Code Playgroud)

模式方法如下:

import java.util.regex._

def pattern(s:String):Option[Pattern] = 
  try {
        Some(Pattern.compile(s))
   }catch{
       case e: PatternSyntaxException => None
   }
Run Code Online (Sandbox Code Playgroud)

如果有人能够阐明在这里使用map和flatMap背后的理由,那将会很棒.

monads scala map for-comprehension

82
推荐指数
3
解决办法
3万
查看次数

任何人都可以解释Monads吗?

可能重复:
什么是monad?

我想我明白'也许莫纳德'是什么,但我不确定其他类型.

monads glossary haskell functional-programming

79
推荐指数
0
解决办法
1万
查看次数

具体示例显示monad在组合下没有关闭(带证据)?

众所周知,应用函子在组合下是封闭的,但是monad不是.但是,我一直难以找到一个具体的反例,表明monad并不总是构成.

这个答案给出[String -> a]了一个非monad的例子.在玩了一下之后,我直觉地相信它,但是这个答案只是说"加入无法实现"而没有给出任何理由.我想要更正式的东西.当然有很多类型的函数[String -> [String -> a]] -> [String -> a]; 必须表明任何这样的功能必然不符合monad法则.

任何例子(附带证据)都可以; 我不一定特别想要证明上述例子.

monads haskell proof composition

79
推荐指数
3
解决办法
4668
查看次数

"Monad变形金刚比效果更强大" - 例子?

Edwin C. Brady撰写的关于Idris影响的"使用代数效应和依赖类型进行编程和推理"的论文包含(未引用的)声明:

尽管[效果和单子变换器]在功率上并不相同 - monad和monad变换器可以表达更多概念 - 但是捕获了许多常见的有效计算.

哪些例子可以通过monad变换器建模而不是效果?

monads functional-programming effects idris

77
推荐指数
1
解决办法
1901
查看次数

Monads作为附属物

我一直在读类别理论中的单子.monads的一个定义使用一对伴随函子.monad是使用这些仿函数的往返定义的.显然,在类别理论中,附加是非常重要的,但我没有看到关于伴随函子的Haskell monad的任何解释.有没有人给它一个想法?

monads haskell functor category-theory

76
推荐指数
3
解决办法
4895
查看次数

使用Java 8的Monads

为了帮助理解monad是什么,有人可以使用java提供一个例子吗?他们有可能吗?

如果你从这里下载预发布的lambda兼容JDK8,可以使用java表达lambda表达式http://jdk8.java.net/lambda/

使用此JDK的lambda示例如下所示,有人可以提供相对简单的monad吗?

public interface TransformService {
        int[] transform(List<Integer> inputs);
    }
    public static void main(String ars[]) {
        TransformService transformService = (inputs) -> {
            int[] ints = new int[inputs.size()];
            int i = 0;
            for (Integer element : inputs) {
                ints[i] = element;
            }
            return ints;
        };

        List<Integer> inputs = new ArrayList<Integer>(5) {{
            add(10);
            add(10);
        }};
        int[] results = transformService.transform(inputs);
    }
Run Code Online (Sandbox Code Playgroud)

java monads optional java-8

75
推荐指数
5
解决办法
3万
查看次数

Haskell Cont monad是如何以及为什么工作的?

这就是Cont monad的定义方式:

newtype Cont r a = Cont { runCont :: (a -> r) -> r }

instance Monad (Cont r) where
    return a = Cont ($ a)
    m >>= k  = Cont $ \c -> runCont m $ \a -> runCont (k a) c
Run Code Online (Sandbox Code Playgroud)

你能解释一下这是如何以及为何有效吗?它在做什么?

monads continuations haskell

70
推荐指数
4
解决办法
8172
查看次数

Monads vs. Arrows

我对函数式编程中使用的monad箭头的概念非常熟悉.我也明白它们可以用来解决类似的问题.

但是,对于如何选择在任何给定情况下使用哪一个,我仍然有点困惑.

我什么时候应该使用monads?什么时候应该使用箭头?

language-agnostic monads haskell functional-programming arrows

70
推荐指数
2
解决办法
8200
查看次数

为什么绑定运算符 (&gt;&gt;=) 是这样定义的?

我已经学习 Haskell 几个星期了(只是为了好玩),刚刚观看了 Brian Beckman介绍 monad的精彩视频。他激励 monad 需要创建一个更通用的组合运算符。按照这个思路,如果我有两个功能:

f :: a -> b
g :: b -> c
Run Code Online (Sandbox Code Playgroud)

组合运算符应该满足

h = g . f :: a -> c
Run Code Online (Sandbox Code Playgroud)

由此我可以推断出正确的.运算符类型:

(.) : (b -> c) -> (a -> b) -> (a -> c)
Run Code Online (Sandbox Code Playgroud)

说到 monad,假设我有两个功能:

f :: a -> m b
g :: b -> m c
Run Code Online (Sandbox Code Playgroud)

在我看来,自然的选择是定义一个通用的组合运算符,其工作方式如下:

h = f >>= g :: a -> m c
Run Code Online (Sandbox Code Playgroud)

在这种情况下,>>=运算符的类型签名为:

(>>=) :: (a -> …
Run Code Online (Sandbox Code Playgroud)

monads haskell bind

69
推荐指数
4
解决办法
4369
查看次数

ST monad是如何工作的?

我知道ST monad就像是IO的小兄弟,后者又是带有RealWorld魔法的状态monad .我可以想象状态,我可以想象RealWorld以某种方式被放入IO,但每次我写一个ST monad 的类型签名都STs我感到困惑.

举个例子吧ST s (STArray s a b).s那里的工作如何?它是否仅用于在计算之间建立一些人工数据依赖性,而不能像状态monad中的状态那样被引用(由于forall)?

我只是抛出想法,真的很感谢比我更有知识的人向我解释.

monads haskell

68
推荐指数
2
解决办法
9429
查看次数