首页 > 其他分享 >无涯教程-Haskell - Monads

无涯教程-Haskell - Monads

时间:2023-12-21 23:32:59浏览次数:30  
标签:mf return 更改 Monad 示例 无涯 Functor Monads Haskell

Monads 只是一种带有某些附加函数的Applicative Functor,它是一个Type类,它管理称为 monadic规则的三个基本规则。

所有这三个规则严格适用于Monad声明,如下所示-

class Monad m where  
   return::a -> m a 
   (>>=)::m a -> (a -> m b) -> m b 
   (>>)::m a -> m b -> m b 
   x >> y=x >>=\_ -> y 
   fail::String -> m a  
   fail msg=error msg 

适用于Monad声明的三项基本法律是-

  • Left Identity Law    -  返回函数不会更改值,并且在Monad中也不应更改任何内容。 可以表示为"return> => mf=mf"。

  • Right Identity Law  - 返回函数不会更改值,并且在Monad中也不应更改任何内容。 可以表示为"mf> => return=mf"。

  • Associativity           - Functor和Monad实例应以相同方式工作, 它可以用数学表示为“(f> ==> g)> => h=f> =>(g>=h)"。

在前面的示例中,我们已经使用了许多Monad,而没有意识到它们是Monad。考虑下面的示例,其中我们使用List Monad生成特定列表。

main=do
   print([1..10] >>= (\x -> if odd x then [x*2] else []))

此代码将产生以下输出-

[2,6,10,14,18]

参考链接

https://www.learnfk.com/haskell/haskell-monads.html

标签:mf,return,更改,Monad,示例,无涯,Functor,Monads,Haskell
From: https://blog.51cto.com/u_14033984/8927237

相关文章

  • 无涯教程-Haskell - 输入&输出
    到目前为止,我们讨论的所有示例本质上都是静态的,在本章中,我们将学习与用户动态交流,我们将学习Haskell中使用的不同输入和输出技术。文件和流到目前为止,我们已经对程序本身中的所有输入进行了硬编码,我们一直在从静态变量获取输入,现在,让我们学习如何从外部文件读取和写入。让我们......
  • 无涯教程-Haskell - 函数组合
    功能组合是将一个功能的输出用作另一个功能的输入的过程,如果我们学习组成背后的数学会更好,在数学中,组成由f{g(x)}表示,其中g()是一个函数,其输出用作输入另一个功能,即f()。看下面的示例代码。在这里,我们使用函数组合来计算输入数字是偶数还是奇数。eveno::Int->Boolnoto......
  • 无涯教程-Haskell - 运算符
    在本章中,我们将了解Haskell中使用的不同运算符,在接下来的章节中,我们将学习更多有关不同运算符及其用法的信息。 +加法顾名思义,加法(+)运算符用于加法函数。main=doletvar1=2letvar2=3putStrLn"Theadditionofthetwonumbersis:"print(var1+var......
  • 无涯教程-Haskell - 类型类
    Haskell是一种函数语言,它是严格类型化的,这意味着编译器将在编译时知道整个应用程序中使用的数据类型。Int整数类型Int是代表Integer类型数据的类型类,2147483647到-2147483647范围内的每个整数都属于Int类型类。fType::Int->Int->IntfTypexy=x*x+y*ymain=print(fT......
  • 无涯教程-Haskell - 环境设置
    从其官方网页下载可用的Haskell设置-https://www.haskell.org/downloadsWindows环境设置要在Windows计算机上设置Haskell环境,请访问其官方网站https://www.haskell.org/platform/windows.html并根据您可定制的体系结构下载安装程序。检查系统的体系结构并下载相应的设置文件......
  • 无涯教程-Go - 函数指针
    Go编程语言使您可以将指针传递给函数,只需将函数参数声明为指针类型。在下面的示例中,我们将两个指针传递给一个函数,并更改该函数内部的值,该值会反映在调用函数中-packagemainimport"fmt"funcmain(){/*局部变量定义*/varaint=100varbint=200fmt.P......
  • 无涯教程-Go - 多维数组函数
    Go编程语言允许多维数组,这是多维数组声明的一般形式-varvariable_name[SIZE1][SIZE2]...[SIZEN]variable_type如,以下声明创建了三维5、10、4个整数数组-varthreedim[5][10][4]int二维数组二维数组是多维数组的最简单形式,本质上,二维数组是一维数组的列表,要声明大小为[x......
  • 无涯教程-Go - 函数闭包
    Go编程语言支持可以充当函数闭包的匿名函数,当我们要内联定义函数而不传递任何名称时,将使用匿名函数。在我们的示例中,我们创建了一个函数getSequence(),该函数返回另一个函数,此函数的目的是关闭上层函数的变量i形成闭包。如-packagemainimport"fmt"funcgetSequence()func......
  • 无涯教程-Go - Function as Value函数
    在下面的示例中,我们使用函数定义初始化了一个变量,该函数变量的目的只是使用内置的math.sqrt()函数。如-packagemainimport("fmt""math")funcmain(){/*声明一个函数变量*/getSquareRoot:=func(xfloat64)float64{returnmath.Sqrt(x)}/*......
  • 无涯教程-Go - for 循环函数
    for循环是一个重复控制结构,它允许您编写一个需要执行特定次数的循环。for-语法Go编程语言中for循环的语法为-for[condition|(init;condition;increment)|Range]{statement(s);}for-示例packagemainimport"fmt"funcmain(){varbint=15......