javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

haskell-函数式编程能最好/最坏地解决哪些问题?

我经常听到函数式编程解决了许多在过程式/命令式编程中很难解决的问题。 但是我也听说过,过程编程自然很擅长解决其他一些问题。

在我开始阅读有关Haskell的书并深入研究函数式编程之前,我至少想要一个基本的概念,以了解我可以真正将其用于什么(书中的示例之外)。 那么,函数式编程最擅长哪些方面? 它不太适合哪些问题?

更新资料

到目前为止,我对此有一些很好的答案。 我迫不及待想现在开始学习Haskell-我只需要等待直到我掌握C :)

函数式编程之所以如此出色的原因:

  • 非常简洁明了-它可以用简短,清晰的陈述表达复杂的想法。
  • 比命令性语言更容易验证-在系统安全至关重要的情况下很好。
  • 功能的纯正和数据的不变性使并发编程更加合理。
  • 非常适合编写脚本和编写编译器(不过我很想知道为什么)。
  • 与数学相关的问题可以简单而精美地解决。

函数式编程遇到的问题:

  • 值得商:的:Web应用程序(尽管我想这取决于应用程序)。
  • 桌面应用程序(尽管它可能取决于语言,但是F#会很好,不是吗?)。
  • 性能至关重要的任何事物,例如游戏引擎。
  • 任何涉及大量程序状态的事物。
trans by 2020-08-12T00:51:59Z

函数式编程-Clojure惰性序列usag

我很难理解一个人如何在Clojure中创建一个惰性序列。

宏的文档对我来说一点都不清晰:

用法:(懒惰和身体) 接受返回ISeq或nil的表达式主体,并产生 一个仅在第一次seq时调用主体的Seqable对象 被调用,并将缓存结果并在所有后续结果中返回 seq调用。

我所看到的所有示例似乎都执行以下操作:

; return everything in the sequence starting at idx n
(defn myseq-after-n [n]
  (...)
)

(def my-lazy-seq
  (lazy-seq (conj [init-value] (myseq-after-n 2)))
)

因此,我不明白的第一件事是,由于lazy-seq不在conj的调用范围内,它如何防止conj在求值时生成无限序列?

我的第二个问题是,惰性序列定义是否总是采用这种通用形式?

trans by 2020-08-11T00:56:12Z

函数式编程-F#中的cons运算符(::)

F#中的::运算符始终将元素添加到列表中。 列表中是否有运算符? 我猜想使用@运算符

[1; 2; 3] @ [4]

效率不如附加一个元素。

trans by 2020-08-10T09:39:10Z

函数式编程-什么是“固化”?

我在几篇文章和博客中都看到过关于咖喱函数的引用,但是我找不到很好的解释(或者至少有一个合理的解释!)

trans by 2020-08-09T14:28:54Z

oop-在纯函数式编程环境中的面向对象编程?

在功能编程(FP)上下文中使用面向对象编程(OOP)有什么优势?

我已经使用F#一段时间了,我注意到我的函数越是无状态的,就越不需要将它们作为对象的方法。 特别是,依靠类型推断使它们可在尽可能多的情况下使用具有优势。

这并不排除需要某种形式的名称空间,该名称空间与成为OOP正交。 也不鼓励使用数据结构。 实际上,FP语言的实际使用在很大程度上取决于数据结构。 如果查看在F Sharp编程/高级数据结构中实现的F#堆栈,您会发现它不是面向对象的。

在我看来,OOP与使方法作用于对象状态主要是为了使对象发生突变而紧密相关。 在不需要或不需要的纯FP上下文中。

一个实际的原因可能是能够与OOP代码进行交互,这与F#与.NET的工作方式几乎相同。 除此之外,还有什么原因吗? 在Haskell的世界中(编程更纯正的FP)有什么经验?

我会很高兴提及任何有关此问题的论文或反事实的例子。

trans by 2020-08-09T09:00:24Z

ios-Swi中泛型和AnyObject之间的区别

考虑此myFilter函数,该函数接受通用参数并根据谓词过滤数组。 与Swift提供的filter()功能相同。

func myFilter<T>(source: [T], predicate:(T) -> Bool) -> [T] {
  var result = [T]()
  for i in source {
    if predicate(i) {
      result.append(i)
    }
  }
  return result
}

这有什么不同

func myFilter(source: [AnyObject], predicate:(AnyObject) -> Bool) -> [AnyObject] {
  var result = [AnyObject]()
  for i in source {
    if predicate(i) {
      result.append(i)
    }
  }
  return result
}

即使在后面的示例中,我们也无法达到泛型的意义吗?

trans by 2020-08-08T22:32:23Z

编译-功能语言天生就慢吗?

为什么功能语言在基准测试中总是落后于C? 如果您使用的是静态类型的功能语言,在我看来,它可以编译为与C相同的代码,甚至可以编译为更优化的代码,因为编译器可以使用更多的语义。 为什么似乎所有功能语言都比C慢,为什么它们总是需要垃圾回收和过多使用堆?

是否有人知道适合嵌入式/实时应用程序的功能语言,在这种语言中,内存分配保持在最低水平,并且生成的机器代码精简而快速?

trans by 2020-08-08T18:07:04Z

计算机科学-如何使用功能性编程语言实现图形和图形算法?

基本上,我知道如何在允许副作用的编程语言中创建图形数据结构和使用Dijkstra的算法。 通常,图算法使用一种结构来将某些节点标记为“已访问”,但这会产生副作用,我试图避免这种副作用。

我可以想到一种用功能语言实现此功能的方法,但它基本上需要将大量状态传递给不同的功能,而且我想知道是否存在更节省空间的解决方案。

trans by 2020-08-07T13:39:52Z

函数式编程-为什么引发异常会有副作用?

根据维基百科关于副作用的条目,提出例外就构成了副作用。 考虑一下这个简单的python函数:

def foo(arg):
    if not arg:
        raise ValueError('arg cannot be None')
    else:
        return 10

始终会遇到使用foo(None)调用它的情况。 相同的输入,相同的输出。 它是参照透明的。 为什么这不是纯函数?

trans by 2020-08-06T16:16:35Z

学习Haskell以学习

我读过一些问题,例如Scala与Haskell讨论了两种语言的优缺点或需要学习的语言,但是我已经知道我想学习Scala。 我是uni的Java程序员,现在主要使用PHP。

我想学习Scala,因为它看起来像是对个人项目Java的改进,并且我还想学习一种功能语言,以提高我作为程序员的知识。

我想知道学习Haskell作为函数式编程的入门是一个好主意,因为它纯粹是函数式的,因此我会适当地学习它,而不是在Scala中使用函数式的零散而又不知道为什么吗?

我也想将Haskell用于个人项目等,因为它看起来很棒,但是我并没有真正看到它在现实世界中的许多应用,似乎更多地用于学术方面,因此想学习它以获得功能上的理解然后继续 到斯卡拉。

trans by 2020-08-05T09:04:05Z

haskell-功能编程范例是否有可视化建模语言或样式?

UML是旨在以OO语言编写的软件建模的标准,并且与Java紧密相连。 仍然可以将其用于建模要以功能编程范例编写的软件吗? 给定嵌入式视觉元素,哪些图将变得有用?

是否有针对函数式编程的建模语言,更具体地说是Haskell? 您会建议使用哪些工具来绘制图表?

由OP编辑,2009年9月2日:

我正在寻找的是代码中最直观,最轻巧的表示。 易于理解的图表,可视化模型不一定针对其他程序员。 我将很快在Haskell中开发游戏,但是由于该项目是为我的毕业总结工作而设计的,因此我需要介绍所提议解决方案的某种形式化形式。 我想知道是否有等效于UML + Java的标准,但Haskell除外。我应该只坚持情节提要,书面说明,非形式化的图表(一些类似于流程图的浅图像),非形式化的用例描述吗?

由jcolebrand编辑,2012年6月21日:

请注意,提问者最初想要一个视觉隐喻,现在已经有三年了,我们正在寻找更多/更好的工具。 最初的答案都没有真正解决“视觉隐喻设计工具”的概念,因此……这就是新的赏金所希望提供的。

trans by 2020-08-05T04:28:24Z

内存管理-为什么纯函数式语言不使用引用计数?

在纯功能语言中,数据是不可变的。 使用参考计数时,创建参考周期需要更改已创建的数据。 似乎纯函数式语言可以使用引用计数,而不必担心循环的可能性。 是吗 如果是这样,为什么不呢?

我知道在很多情况下引用计数都比GC慢,但至少可以减少暂停时间。 如果暂停时间不好,可以选择使用引用计数。

trans by 2020-08-03T18:16:55Z

oop-如何将Haskell类型类转换为F#?

我正在尝试将Haskell核心库的Arrows转换为F#(我认为这是一个很好的练习,可以更好地理解Arrows和F#,我也许可以在我正在从事的项目中使用它们。)但是,直接翻译 由于范式的差异而无法实现。 Haskell使用类型类来表达这些内容,但是我不确定哪种F#构造的最佳方式将类型类的功能与F#的习语相映射。 我有一些想法,但最好将其提出来,看看在功能上最接近的东西。

对于tl人群:如何将类型类(Haskell习惯用语)转换为F#惯用代码?

对于那些接受我的详细解释的人:

Haskell标准库中的这段代码是我要翻译的示例:

class Category cat where
    id :: cat a a
    comp :: cat a b -> cat b c -> cat a c
class Category a => Arrow a where
    arr :: (b -> c) -> a b c
    first :: a b c -> a (b,d) (c,d)

instance Category (->) where
    id f = f
instance Arrow (->) where
    arr f = f
    first f = f *** id

尝试1:模块,简单类型,让绑定

我的第一步是直接使用模块进行组织,例如:

type Arrow<'a,'b> = Arrow of ('a -> 'b)

let arr f = Arrow f
let first f = //some code that does the first op

那行得通,但是由于我没有实现类别,并且不能轻易实现更专业的Arrows,所以它在多态性上输了。

尝试1a:使用签名和类型进行优化

纠正“尝试1”中某些问题的一种方法是使用.fsi文件定义方法(这样,可以更轻松地强制执行类型),并使用一些简单的类型调整来进行专门化。

type ListArrow<'a,'b> = Arrow<['a],['b]>
//or
type ListArrow<'a,'b> = LA of Arrow<['a],['b]>

但是fsi文件不能在其他实现中重复使用(强制使用let绑定函数的类型),并且类型重命名/封装的东西很棘手。

尝试2:对象模型和接口

将F#也构建为面向对象也是合理的,也许类型层次结构是执行此操作的正确方法。

type IArrow<'a,'b> =
    abstract member comp : IArrow<'b,'c> -> IArrow<'a,'c>
type Arrow<'a,'b>(func:'a->'b) = 
    interface IArrow<'a,'b> with
        member this.comp = //fun code involving "Arrow (fun x-> workOn x) :> IArrow"

除了让静态方法(如comp和其他运算符)发挥作用像实例方法可能会带来多大的痛苦之外,还需要明确地转换结果。 我也不确定这种方法是否仍能捕获类型级多态性的全部表现力。 这也使得很难使用必须是静态方法的东西。

尝试2a:使用类型扩展进行优化

因此,另一种可能的改进是将接口声明为尽可能裸,然后使用扩展方法向所有实现类型添加功能。

type IArrow<'a,'b> with
    static member (&&&) f = //code to do the fanout operation

嗯,但这使我无法对所有类型的IArrow使用一种方法。 如果我希望ListArrows稍有不同(&&&),该怎么办? 我还没有尝试过这种方法,但是我想我可以遮盖(&&&),或者至少提供一个更专业的版本,但是我觉得我不能强制使用正确的变体。

帮我

那我应该在这里做什么? 我觉得OO应该足够强大以替换类型类,但是我似乎无法弄清楚如何在F#中实现这一点。 我的任何尝试都结束了吗? 他们中的任何一个都“足够好”并且必须足够好吗?

trans by 2020-08-02T09:52:46Z

在Kotlin内的功能循环中,我该如何“中断”或“继续”?

在Kotlin中,我无法在函数循环和lambda中执行continuebreak,就像在普通for循环中所做的那样。 例如,这不起作用:

(1..5).forEach {
    continue@forEach  // not allowed, nor break@forEach
}

有旧的文档提到此功能可用,但似乎从未实现。 当我想从lambda内部获取continuebreak时,获得相同行为的最佳方法是什么?

注意:这个问题是作者故意写和回答的(自我回答的问题),因此SO常见问Kotlin主题的惯用答案。 还要澄清一些针对Kotlin字母的非常古老的答案,这些答案对于当今的Kotlin而言并不准确。

trans by 2020-07-30T18:04:23Z

haskell-在游戏开发中使用函数式编程的良好资源吗?

我对函数式编程范式还很陌生,但到目前为止,我还是喜欢它。 由于我从事游戏开发,因此我想尝试以纯函数式编程风格编写一些游戏。 我不在乎这种语言-不管是Erlang,Haskell,Lisp还是Ruby(我发现它都支持函数式编程特性)。

好吧,很明显,学习函数式编程(实际上是任何东西),最好的建议就是学习函数式语言并在其中进行很多编程。 但是我要寻找的是在游戏和游戏引擎(2D或3D)中使用函数式编程的一些资源。

那么,您是否知道任何功能性编程文章/书籍/博客/有关在实际游戏中使用它的任何知识,或者是否设计了具有功能性编程语言的简单游戏引擎,以及在此功能性环境中游戏与游戏引擎之间的所有交互作用?

请不要建议“只是开始用功能编程简单的东西,然后它会逐渐出现”。 正如我之前所说,这很明显,但是我要问的是有关该主题的一些资源,如果有的话。 谢谢!

trans by 2020-07-30T16:04:06Z

编程语言-什么是“表达问题”?

我对这是什么有一个大概的了解,但是如果有人对“表达问题”有一个解释,认为他们是简洁直观的,我很乐意听到。

trans by 2020-07-27T17:08:49Z

递归-为什么在球拍中以奇怪的方式定义折叠?

与许多其他功能语言一样,在Haskell中,功能foldl定义为例如foldl

可以,因为foldl按照定义是(foldl (flip -) 0 '(1 2 3 4))

但是,在球拍中foldl为2,因为球拍“智能地”计算如下:(foldl (flip -) 0 '(1 2 3 4)),确实为2。

当然,如果我们定义辅助功能翻转,如下所示:

(define (flip bin-fn)
  (lambda (x y)
    (bin-fn y x)))

那么我们可以在Racket中实现与Haskell相同的行为:代替foldl,我们可以这样写:(foldl (flip -) 0 '(1 2 3 4))

问题是:为什么在球拍中foldl用一种奇怪的(非标准和非直观的)方式定义,而不是用其他任何一种语言来定义?

trans by 2020-07-26T21:59:51Z

性能-Scala函数式编程是否比传统编码慢?

在我第一次创建功能代码的尝试中,我遇到了一个性能问题。

我从一个常见的任务开始-将两个数组的元素相乘并得出结果:

var first:Array[Float] ...
var second:Array[Float] ...    
var sum=0f; 
for (ix<-0 until first.length) 
    sum += first(ix) * second(ix);

这是我改革工作的方式:

sum = first.zip(second).map{ case (a,b) => a*b }.reduceLeft(_+_)

当我对这两种方法进行基准测试时,第二种方法需要40倍的时间才能完成!

为什么第二种方法需要这么长时间? 我如何才能使工作既高效又能使用函数式编程风格呢?

trans by 2020-07-26T16:21:08Z

函数式编程-是否有一个不会自动变平的jQuery地图实用程序?

我正在将一个包含两个域的数组从一个域(日期)映射到另一个域(时间戳)。 不幸的是,它看起来像Array.map自动平整我返回的两个元组,而我看不到do_not_flatten参数。

我是否在库中丢失了无法自动拼合的其他内容?

附录:我假设我不应该使用不会自动变平的2980432269669674021888,因为它是JavaScript 1.6。 据我了解,出于兼容性原因,jQuery应该抽象出我正在运行的JavaScript版本。

trans by 2020-07-24T10:08:41Z

f#-什么是if-then语句的功能替代品?

我一直在学习F#和函数式编程,并尝试以函数式方式进行操作。 但是,当涉及到重写某些我已经用C#编写的代码时,我陷入了简单的if-then语句中(仅执行某些操作而不返回值的语句)。 我知道您可以在F#中实现:

if expr then do ()

但是,我认为这是一种强制性的编码方法吗? 也许我对函数式编程还没有足够的了解,但是对我来说似乎并不起作用。 我认为功能方法是组成函数和表达式,而不是简单地一个接一个地执行语句,这是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()

if-then的主体不返回任何内容,但是我不知道如何使它更具功能性(如果可能的话)。 我不知道最小化命令性代码的正确技术。 鉴于F#的性质,直接传输C#非常容易,但是我很难将其启用。 每当我在C#中遇到这样的if语句,并且试图将其传输到F#时,我都会灰心,因为我想不出一种使代码更具功能性的方法。

trans by 2020-07-23T14:50:07Z

1 2 3 4 5 6 7 8 9 10 11 12 下一页 共12页