我承认我对功能编程知之甚少.我从这里和那里读到它,因此我们知道在函数式编程中,无论函数被调用多少次,函数都会为相同的输入返回相同的输出.它就像一个数学函数,对于函数表达式中涉及的输入参数的相同值,计算相同的输出.
例如,考虑一下:
f(x,y) = x*x + y; // It is a mathematical function
Run Code Online (Sandbox Code Playgroud)
无论你使用多少次f(10,4),它的价值永远都是104.因此,无论您在何处编写f(10,4),都可以替换它104,而无需更改整个表达式的值.此属性称为表达式的引用透明度.
正如维基百科所说(链接),
相反,在函数代码中,函数的输出值仅取决于输入到函数的参数,因此使用参数x的相同值调用函数f两次将产生相同的结果f(x).
函数式编程中是否存在时间函数(返回当前时间)?
如果是,那么它如何存在?它是否违反了函数式编程的原理?它特别违反了引用透明性,这是函数式编程的一个属性(如果我正确理解它).
或者如果不是,那么如何才能知道函数式编程中的当前时间?
我最近发现了FP bug(试图学习Haskell),到目前为止我已经看到了(一流的功能,懒惰的评估和所有其他好东西).我还不是专家,但是我已经开始发现在功能上比在基本算法上强制推理更容易(而且我很难回到我必须去的地方).
然而,当前FP看起来平坦的一个领域是GUI编程.Haskell方法似乎只是包装命令式GUI工具包(例如GTK +或wxWidgets)并使用"do"块来模拟命令式样式.我没有使用过F#,但我的理解是它使用OOP和.NET类做了类似的事情.显然,有一个很好的理由 - 当前的GUI编程完全是关于IO和副作用的,所以对于大多数当前的框架来说,纯函数式编程是不可能的.
我的问题是,是否可以使用GUI编程的功能方法?我无法想象在实践中这会是什么样子.有没有人知道任何尝试此类事物的框架(实验或其他)(或者甚至是为功能语言设计的任何框架)?或者只是使用混合方法的解决方案,其中OOP用于GUI部件,FP用于逻辑?(我只是想出于好奇心 - 我很想认为FP是"未来",但GUI编程似乎是一个非常大的漏洞.)
在过去的几年里,F#已经演变成微软完全支持的语言之一,采用了在OCaml,ML和Haskell中孵化的许多想法.
在过去几年中,C#通过引入越来越多的功能语言功能扩展了其通用功能:LINQ(列表理解),Lambdas,闭包,匿名代表等等......
鉴于C#采用这些功能特性和F#的分类法作为一种不纯的函数式语言(它允许您在调用函数时访问框架库或更改共享状态),两种语言之间存在很强的相似性,尽管每种语言都有自己的极端主要强调.
我对您在制作多语言程序中使用这两种语言的任何成功模型以及您在过去一年中使用F#编写的生产软件(Web应用程序,客户端应用程序,服务器应用程序)中的区域感兴趣用C#编写.
我如何进入F#编程?
有哪些好的入门样本可以学习语言,或者了解一些优于其他语言的优势?
我需要什么工具(例如Windows,Visual Studio,......)?
Levenshtein在C#和F#中的实现.对于两个大约1500个字符的字符串,C#版本快10倍.C#:69 ms,F#867 ms.为什么?据我所知,他们完全一样吗?无论是Release还是Debug构建都无关紧要.
编辑:如果有人来这里专门寻找编辑距离实施,它就会被打破.工作代码在这里.
C#:
private static int min3(int a, int b, int c)
{
return Math.Min(Math.Min(a, b), c);
}
public static int EditDistance(string m, string n)
{
var d1 = new int[n.Length];
for (int x = 0; x < d1.Length; x++) d1[x] = x;
var d0 = new int[n.Length];
for(int i = 1; i < m.Length; i++)
{
d0[0] = i;
var ui = m[i];
for (int j = 1; j < n.Length; j++ )
{ …Run Code Online (Sandbox Code Playgroud) F#派生自OCaml,但缺少或添加了哪些主要项目?具体来说,我很好奇可用于学习OCaml的资源是否对想要学习F#的人有用.
试图学习F#,但在尝试区分折叠和减少时感到困惑.折叠似乎做同样的事情,但需要额外的参数.是否存在这两种功能存在的合理原因,或者它们是否适合具有不同背景的人?(例如:C#中的字符串和字符串)
以下是从示例中复制的代码段:
let sumAList list =
List.reduce (fun acc elem -> acc + elem) list
let sumAFoldingList list =
List.fold (fun acc elem -> acc + elem) 0 list
printfn "Are these two the same? %A "
(sumAList [2; 4; 10] = sumAFoldingList [2; 4; 10])
Run Code Online (Sandbox Code Playgroud) 我正在尝试用F#设计一个库.该库应该对F#和C#都很友好.
这就是我被困住的地方.我可以使它F#友好,或者我可以使它C#友好,但问题是如何使它友好的两者.
这是一个例子.想象一下,我在F#中有以下功能:
let compose (f: 'T -> 'TResult) (a : 'TResult -> unit) = f >> a
Run Code Online (Sandbox Code Playgroud)
这完全可以从F#中使用:
let useComposeInFsharp() =
let composite = compose (fun item -> item.ToString) (fun item -> printfn "%A" item)
composite "foo"
composite "bar"
Run Code Online (Sandbox Code Playgroud)
在C#中,该compose函数具有以下签名:
FSharpFunc<T, Unit> compose<T, TResult>(FSharpFunc<T, TResult> f, FSharpFunc<TResult, Unit> a);
Run Code Online (Sandbox Code Playgroud)
但当然我不想FSharpFunc签名,我想要的是Func,Action而是像这样:
Action<T> compose2<T, TResult>(Func<T, TResult> f, Action<TResult> a);
Run Code Online (Sandbox Code Playgroud)
为此,我可以创建这样的compose2函数:
let compose2 (f: Func<'T, 'TResult>) (a : Action<'TResult> ) …Run Code Online (Sandbox Code Playgroud)