Hoogle认为,<=<
(Kleisli单子合成,或“左鱼”)和=<<
(reverse monad bind)的固定性为infixr1
。如果我没看错的话,一个表达式,比如
print <=< return =<< return "foo"
应该是无效的,因为它相当于同样无效的
print <=< (return =<< return "foo")
但是出于某种原因,尽管第一个表达式在Haskell中似乎无效,但正如所料,Frege似乎没有抱怨,并在=<<
之前计算<=<<
。
当我在pointfree.io上搞清楚如何制作类似
foo >>= (bar <=< baz)
bar <=< baz =<< foo
弗雷格像哈斯克尔,但弗雷格不是哈斯克尔。在Frege中,这些运算符的固定性是不同的:=<<
是infixr2
和<=<
是infixr3
。因此,由于<=<
具有较低的优先级,bar<=
(bar<=
(事实上,
=<<
和<=<
在Frege中的类型与在Haskell中的类型不同:它们没有monad
约束,而是有bind
约束,其中bind
类似于monad
没有pure
/return
。)
是的,Frege将自己描述为“JVM的Haskell”,但它们的意思是“Haskell”,因为Common Lisp是Lisp,Scheme是Lisp,Clojure是Lisp。看到“Haskell”以那种方式使用很奇怪;更正常的情况是看到“类似Haskell的JVM语言”,或者更强大的语言。但弗雷格太像了,我能明白为什么。
而且,您是对的:这似乎是
pointfree
(支持pointfree.io的程序)中的一个bug!PointFree
应该生成Haskell代码,而不是Frege,因此转换无效意味着它做了错误的事情。
Haskell是一种纯函数式编程语言,它的命名源自美国数学家Haskell Brooks Curry,他在数学逻辑方面上的工作使得函数式编程语言有了广泛的基础。Haskell语言是1990年在编程语言Miranda的基础上标准化的,并且以λ演算为基础发展而来。这也是为什么Haskell语言以希腊字母“λ”(Lambda)作为自己的标志。Haskell语言的最重要的两个应用是Glasgow Hask
Haskell中的Zippers是一个指向数据结构(例如树)的某些特定位置的指针。 假设具有5个元素的树,可以将其表示为完全二叉树。如果要更新此列表的最后一个元素,则需要遍历所有元素以到达最后一个元素,然后再进行更新。 但是,如果我们以具有N个元素的树是的集合的方式构造树,那该怎么办? 那么,可以不需要遍历所有不需要的(N-1)个元素。直接更新第N个元素,这正是Zipper的概念。它聚焦或指向树的
单子(Monad)只是一种带有某些附加功能的Applicative Functor。它是一个类,它管理三个基本规则(称为一元规则)。 这三个规则严格适用于Monad声明,如下所示: 单子(Monad)式声明的三个基本原则是: 左标识定律 - 返回函数不会更改值,并且不应更改Monad中的任何内容。可以表示为:; 右标识定律 - 返回函数不会改变值,也不会改变Monad中的任何内容。它可以表示为:;
Mu for Haskell This repo defines a set of libraries to write microservices in a format- and protocol-independent way. It shares the same goals as Mu for Scala, but using idiomatic Haskell and more typ
Serverless Haskell Deploying Haskell code onto AWS Lambda using Serverless. Prerequisites AWS account Stack NPM Docker Usage There are two ways to start, either via the stack template, or directly mod
GHC(Glasgow Haskell compiler)是 Haskell 最顶级最好的编程套件,包括一个优化的编译器,生成各种平台的优秀代码,同时还有个交互式系统,让用户使用起来更简单方便,能使用 Haskell 进行快速的开发。它支持多种语言的扩展,包括并发,异常和其他语言的接口(C 语言等等)。