`

haskell - Monads - the do monad

 
阅读更多

In this post, we will examine the do monad haskell...

 

Monads in Haskell are so useful that they got their own special syntax called do notation.  Its principle is still the same: gluing together monadic values in sequence. We're going to take a look at how do notation works and why it's useful.

ghci> Just 3 >>= (\x -> Just "!" >>= (\y -> Just (show x ++ y)))  
Just "3!"  

 

which is equivalent to the following. 

ghci> let x = 3; y = "!" in show x ++ y  
"3!"  

 

the monadic value is different from the let do value becaue it has monadic value has failure value. 

to make the point more claer, here is another code. 

foo :: Maybe String  
foo = Just 3   >>= (\x -> 
      Just "!" >>= (\y -> 
      Just (show x ++ y)))  

 

and to get rid of all the annoying lambdas, haskell gives us the do notation. 

foo :: Maybe String  
foo = do  
    x <- Just 3  
    y <- Just "!"  
    Just (show x ++ y)  

  It's important to remember that do expressions are just different syntax for chaining monadic values.(the <- value like the ability to extract the value from the maybe container)..

 

In a do expression, every line is a monadic value. To inspect its result, we use<-. If we have a Maybe String and we bind it with <- to a variable, that variable will be a String, just like when we used >>= to feed monadic values to lambdas. The last monadic value in a do expression, likeJust (show x ++ y) here, can't be used with <- to bind its result, because that wouldn't make sense if we translated the do expression back to a chain of>>= applications.Rather, its result is the result of the whole glued up monadic value, taking into account the possible failure of any of the previous ones.

 

let's see more examples.

ghci> Just 9 >>= (\x -> Just (x > 8))  
Just True  

 

which is the same as the following. 

 

marySue :: Maybe Bool  
marySue = do   
    x <- Just 9  
    Just (x > 8)  

 and we can rewrite hte routine that we do land birds. 

routine :: Maybe Pole  
routine =   
    case Just (0,0) of   
        Nothing -> Nothing  
        Just start -> case landLeft 2 start of  
            Nothing -> Nothing  
            Just first -> case landRight 2 first of  
                Nothing -> Nothing  
                Just second -> landLeft 1 second  

 and that can be write as follow. 

routine :: Maybe Pole  
routine = do  
    start <- return (0,0)  
    first <- landLeft 2 start  
    Nothing  
    second <- landRight 2 first  
    landLeft 1 second  

 

and in do notation, wehen we biknd monadic valus to names, we can utllized pattern matching. just like in let expression functions paramters, here is an example of pattern matching in a do expression,. 

justH :: Maybe Char  
justH = do  
    (x:xs) <- Just "hello"  
    return x  

 the value returned is 'h'... 

 

the beauty of monad is that it unlike the error binding, which fails and the program might fail, however, with the monad value, you may have a special value to represent a failure value. 

remember the definition of hte fail method. 

fail :: (Monad m) => String -> m a  
fail msg = error msg  

 for maybe, the fail method is define as this. 

fail _ = Nothing  

 

so with this, let' see if we feed some error values to it, how it will be reacting to that. 

wopwop :: Maybe Char  
wopwop = do  
    (x:xs) <- Just ""  
    return x  

 if you run this, and you can see the result as follow. 

ghci> wopwop  
Nothing  

 

分享到:
评论

相关推荐

    little-book-of-haskell-monads:“ Haskell Monads小书” –关于Haskell Monads的书的初稿,请注明,Monad Transformers,..

    Haskell Monads小书 :warning: 初稿! –请仔细阅读 1. do块 2.解释嵌套的Lambda和绑定 =&lt;&lt;作为序列运算符 2C 。 a- a -&gt; M b背后的直觉 2D合成do块 2E 。 嵌套do块 3.实现Monad和封装 3A 。 新型和副...

    haskell-cs194:Haskell 通过 http 播放

    3. Monads:理解monads的概念,如IO、Maybe、List等monad,以及如何使用do notation进行monadic操作。 4. Lazy Evaluation:了解惰性求值的工作原理及其对性能和内存管理的影响。 5. 类型系统:深入理解Haskell的强...

    From Simple IO to Monad Transfo - J Adrian Zimmer.pdf

    #### 三、Monad与(&gt;&gt;=)组合器(Monads and the (&gt;&gt;=) Combinator) 该章节介绍了Monad的基础概念及其核心运算符(&gt;&gt;=)。Monad是Haskell中用于处理副作用的一种抽象数据类型。它允许开发者以一种类型安全的方式处理...

    haskell-practice

    在这样的项目中,你可能会遇到函数定义、类型定义、模块组织、错误处理、类型类实现、monad的使用,以及其他高级特性,如do记法和类型家族。 总的来说,"哈斯克尔实践"涵盖了纯函数式编程的各种深度话题,从基本的...

    B10-Haskell趣学指南.pdf

    第十二章和第十三章详细讲解了Maybe Monad、Monad类型类、do表示法以及List Monad等高级特性。Monad的介绍会让读者对Haskell的高级特性有更深入的理解。 《Haskell趣学指南》这本教材通过系统的介绍和实例演示,...

    A Painless introduction to monads

    了解了Monads的基础知识之后,可以通过阅读更多关于Haskell和函数式编程的资源来深化对Monads的理解。以下是一些推荐的学习资源: - **《Real World Haskell》**: 一本详尽介绍Haskell编程的书籍,包括Monads在内的...

    haskell_语法详细参考 你用你知道

    8. **Monads(Monad)** - **Monad**:是一种抽象概念,用于处理副作用和控制流,如 IO 操作。 - **do 语句**:使用 `do` 语句编写 monadic 代码,使其更接近命令式编程风格。 - **常用 Monad**:包括 `Maybe`...

    haskell编程:《 Haskell编程》(第二版)一书中的练习解决方案

    - **do表达式**:使得Monad的使用更加直观,类似于顺序执行语句。 6. **练习解决方案** - 书中提供的练习涵盖了上述所有主题,解决这些练习能帮助读者巩固理论知识,提升实际编程技能。 - `programming-in-...

    erlmonads:Erlang 的语法扩展提供了 do-notation 和 Monads

    Do :这为 Erlang 添加了对do -syntax 和 monads 的支持。 它们深受启发,monad 和库是来自 Haskell GHC 库的近乎机械的翻译。 导入为:这增加了对将远程函数导入当前模块命名空间的支持,并显式控制本地函数名称...

    salmon:普通Lisp的Monad

    三文鱼Common Lisp中monad的可... 在Haskell中,monad理解如下: do a &lt;- [ 1 , 2 , 3 ] let c = 5 b &lt;- [ 4 , 5 ] return (a + b + c) 在鲑鱼中表达相同的模式(mdo (a '( 1 2 3 )) ( let (c 5 )) (b '( 4 5 ))

    haskell代码:Haskell代码试用

    使用do语法可以更方便地组合Monads。 此外,Haskell支持惰性求值,这意味着表达式只在需要时才进行计算,这有助于优化性能并允许无限数据结构的存在。例如,无限列表`[1..]`表示一个包含所有正整数的列表,尽管它...

    fp-course-learn:学习haskell

    - Monads是Haskell处理副作用和控制流的一种抽象方式,常见的monad有`IO`, `Maybe`, `Either`, 和 `State`等。 - `do`记法使得使用monads的代码更易读。 8. **类型合成与泛型编程** - 类型合成允许新的类型从...

    Learning-Haskell:学习函数式编程语言Haskell,以进一步了解我的知识

    Haskell还有其他特性,如`do`块用于简化Monad的使用,`Maybe`和`Either`类型用于处理可能的错误,以及`Record`系统来创建带有字段名的数据类型。通过`GHCi`交互式环境,开发者可以轻松地测试代码和探索Haskell的功能...

    免费证明:“一个Monad证明全部”的资源

    可能的内容包括如何构建特定类型的Monad实例,如何在Haskell中使用`do`块表达计算流程,以及如何将这些计算转换为Coq的证明语句。 学习这部分内容,开发者可以提升对Monad的理解,掌握在Haskell中进行形式化验证的...

    WhyHaskellMatters:在本文中,我将通过展示Haskell的一些最重要和与众不同的功能,并通过可用的代码示例对其进行详细说明,以解释Haskell为何如此重要。 该演示文稿旨在成为独立的,不需要任何以前的语言知识

    - 代码示例:`do` 语句用于组合Monads,使得代码更易读。 3. **函数组合** - Haskell中,函数可以像其他值一样被传递和组合,增强了代码的模块化和可复用性。 - 例如:`(f . g) x` 表示先应用函数 `g`,然后将...

    Haskell学习

    - `do` notation使得Monad的组合看起来更像顺序代码,便于理解。 7. 并发和并行: - 由于Haskell的纯函数特性,其并发实现非常简单,可以利用GHC的`forkIO`函数创建线程,而不用担心数据竞争问题。 - 并行编程...

    核心库提案:对Haskell核心库的拟议更改

    6. **并发与并行**:Haskell的Monads为处理并发和并行提供了自然的模型。然而,可能的提案可能提出增强这些能力,如改进STM(Software Transactional Memory)库,或者添加对异步异常的新支持。 7. **编程模式和...

    programacaoFuncional:当地的up up up minhas atividades em Haskell

    7. **Monads**:Monad是Haskell中的核心概念,它提供了一种处理计算顺序和副作用的方式。理解Monad的工作原理,包括IO Monad,对于深入Haskell编程至关重要。 8. **GHC编译器和扩展**:了解Glasgow Haskell ...

    24天语法语法巫术:使用Haskell和PureScript调整角色的乐趣和收益

    6. Monads:理解Monads在函数式编程中的作用,如IO Monad、State Monad等,以及如何使用do语句。 7. 性能优化:了解如何利用惰性求值和纯函数的性质来提高程序性能。 8. 测试和调试:学习如何在Haskell和PureScript...

    做什么:自动跟踪do表达式中的所有(可显示)绑定

    在Haskell这个函数式编程语言中,`do`表达式是一种语法糖,它使得写出命令式的代码风格成为可能,主要用于处理monads。`do`表达式通常用于序列化操作,结合了monad的bind(&gt;&gt;=)和return操作。在这个场景下,“自动...

Global site tag (gtag.js) - Google Analytics