在阅读哈斯克尔有关的东西,我有时会遇到表达"绑结",我想我明白了什么是这样,而不是如何.
那么,对这个概念有什么好的,基本的,简单易懂的解释吗?
我希望有一个二进制运算符cross(交叉产品/笛卡尔积)在Scala中使用遍历运算:
val x = Seq(1, 2)
val y = List('hello', 'world', 'bye')
val z = x cross y # i can chain as many traversables e.g. x cross y cross w etc
assert z == ((1, 'hello'), (1, 'world'), (1, 'bye'), (2, 'hello'), (2, 'world'), (2, 'bye'))
Run Code Online (Sandbox Code Playgroud)
仅在Scala中执行此操作的最佳方法是什么(即不使用scalaz之类的东西)?
functional-programming scala cartesian-product cross-product
我看不到语言的评估策略与其纯度之间的联系。考虑到推文作者的声誉,我肯定忽略了一些东西。也许有人可以阐明一些观点。
haskell functional-programming language-implementation lazy-evaluation purity
我最近看到了一些Clojure或Scala(对不起,我不熟悉它们),他们确实在列表或类似的东西上拉链.什么是拉链,它来自哪里?
Haskell通常被引用为纯函数式语言的示例.鉴于存在,这怎么可能是合理的System.IO.Unsafe.unsafePerformIO?
编辑:我认为"纯功能"意味着不可能将不纯的代码引入程序的功能部分.
haskell type-systems functional-programming referential-transparency unsafe-perform-io
在Haskell中,与许多其他函数语言一样,函数foldl被定义为例如foldl (-) 0 [1,2,3,4] = -10.
这没关系,因为foldl (-) 0 [1, 2,3,4]根据定义,((((0 - 1) - 2) - 3) - 4).
但是,在Racket中,(foldl - 0 '(1 2 3 4))是2,因为Racket"智能地"计算如下:(4 - (3 - (2 - (1 - 0)))),确实是2.
当然,如果我们定义辅助功能翻转,像这样:
(define (flip bin-fn)
(lambda (x y)
(bin-fn y x)))
Run Code Online (Sandbox Code Playgroud)
然后我们可以在Racket中实现与Haskell相同的行为:而不是(foldl - 0 '(1 2 3 4))我们可以写:(foldl (flip -) 0 '(1 2 3 4))
问题是:为什么foldl球拍以这种奇怪的(非标准的,非直观的)方式定义,与其他语言不同?
我一直在学习F#和函数式编程,并试图以功能的方式做事.但是,当我重写一些我已用C#编写的代码时,我会陷入简单的if-then语句(只做一些事情而不返回值).我知道你可以在F#中解决这个问题:
if expr then do ()
Run Code Online (Sandbox Code Playgroud)
但是,我认为这是编码的必要方法?也许我对功能编程学得不够,但它对我来说似乎没什么用.我认为功能方法是组合函数和表达式,而不是简单地一个接一个地执行语句,这是if-then似乎鼓励的.
所以,我错过了什么,如果 - 那么在功能世界中是完美的吗?如果没有,这种陈述的功能等同物是什么?我怎么能拿一个if-then然后把它变成功能呢?
编辑:我可能会问错误的问题(对不起,对于函数式编程来说仍然相当新):让我们采用一个真实世界的例子让我甚至问这个问题:
if not <| System.String.IsNullOrWhiteSpace(data) then do
let byteData = System.Text.Encoding.Unicode.GetBytes(data)
req.ContentLength <- int64 byteData.Length
let postStream : System.IO.Stream = req.GetRequestStream()
postStream.Write(byteData, 0, byteData.Length)
postStream.Flush()
postStream.Dispose()
Run Code Online (Sandbox Code Playgroud)
if-then的主体不返回任何内容,但我不知道如何使其更具功能性(如果可能的话).我不知道最小化命令式代码的正确技巧.考虑到F#的性质,直接运输我的C#相当容易,但是我很难将其转换为功能.每次我在C#中使用if语句,并且我正在尝试将其传输到F#时,我感到气馁,因为我无法想到一种方法来使代码更具功能性.
我正在努力学习Haskell,而且我已经完成了所有的基础知识.但是现在我被卡住了,试图让我的头围绕着仿函数.
我读到"仿函数将一个类别转换为另一个类别".这是什么意思?
我知道这有很多问题,但是有人能给我一个关于仿函数的简单英语解释或者一个简单的用例吗?
在科特林,我不能做一个break或continue一个功能回路和我的拉姆达内-就像我可以从一个正常的for循环.例如,这不起作用:
(1..5).forEach {
continue@forEach // not allowed, nor break@forEach
}
Run Code Online (Sandbox Code Playgroud)
有旧的文档提到这个可用,但它似乎从未实现过.当我想要continue或break来自lambda 时,获得相同行为的最佳方法是什么?
注意: 这个问题是由作者故意编写和回答的(自答案问题),因此对于常见问题的Kotlin主题的惯用答案存在于SO中.还要澄清为Kotlin的alphas写的一些非常古老的答案,这些答案对于当前的Kotlin来说是不准确的.