小编Guy*_*der的帖子

如果SML.NET有仿函数为什么不能F#?

这个问题始于

  1. 我将LC PAULSON 的" ML for the working Programmer "(WorldCat)翻译成F#,它使用仿函数作为例子.
  2. 最终希望翻译使用仿函数的Chris Okasaki的" Purely Functional Data Structures "(WorldCat).
  3. 阅读" 类别类型和结构 - 工作计算机科学家类别理论导论 "(WorldCat),作者:Andrea Asperti和Giuseppe Longo.
  4. 不理解这一切,主要是类别理论.

SML.NET可以做仿函数并使用Microsoft .NET.
*请参阅:SML.NET用户指南第4.8.2节类类型和仿函数?

由于Microsoft .NET的一些限制,我一直看到F#无法做真正的仿函数.
*ML仿函数可以用.NET完全编码(C#/ F#)吗?
*算子的任何解决方法?

那么如果SML.NET可以在.NET上运行仿函数那么为什么F#不能呢?SML.NET做了什么,F#不能做什么?

我越了解来自类别理论的仿函数,我越看到它们的美丽,并希望在F#中拥有它们.

编辑

在追求更好的理解范畴论和函数式编程之间的关系看,这些Q&ACS回答#.

f# ocaml ml sml functor

36
推荐指数
1
解决办法
3197
查看次数

F# - 没有参数的函数?

在思考功能性思维模式时,假设函数应该是纯粹的,那么可以断定任何没有参数的函数基本上只是一个值.
然而,reallity阻碍了,并且对于不同的输入,我可能不需要某个函数,并且如果该函数在计算上是昂贵的,那么如果不需要它我不想评估它.
我找到了一个解决方法,使用let func _ = ...func 1或其他任何东西来调用它,但这对读者来说非常非惯用且令人困惑.

这归结为一个问题:在F#中,是否有一种正确的方法来声明一个零参数的函数,而没有在声明中进行评估?

f# functional-programming unit-type

35
推荐指数
2
解决办法
6198
查看次数

F#集合初始化器语法

F#中的集合初始化程序语法是什么?在C#中,您可以编写如下内容:

new Dictionary<string, int>() {
    {"One", 1},
    {"two", 2}}
Run Code Online (Sandbox Code Playgroud)

我如何在F#中做同样的事情?我想我可以使用自己的语法,但似乎应该有一个内置或标准的语法.

f# inline

34
推荐指数
4
解决办法
9753
查看次数

F#尾递归函数示例

我是F#的新手,正在阅读有关尾递归函数的内容,希望有人可以给我两个不同的函数foo实现 - 一个是尾递归的,另一个不是我可以更好地理解这个原理.

f# tail-recursion

33
推荐指数
4
解决办法
2万
查看次数

找到格式正确的括号的所有组合

这是在与朋友交谈时提出的,我想我会问这里,因为这是一个有趣的问题,并希望看到其他人的解决方案.

任务是编写一个函数Brackets(int n),它打印1 ... n 中格式正确的括号的所有组合.对于Brackets(3),输出将是

()
(())  ()()   
((()))  (()())  (())()  ()(())  ()()()
Run Code Online (Sandbox Code Playgroud)

c# algorithm f# catalan

32
推荐指数
5
解决办法
2万
查看次数

.Net中的非常大的集合会导致内存不足异常

我正在测试.Net中的集合有多大.从技术上讲,任何集合对象都可以增长到物理内存的大小.

然后,我测试的服务器,它具有16GB内存下面的代码,运行Windows 2003 Server和Visual Studio 2008,我测试两个F#和C#代码,看了看任务管理器运行时.我可以看到,在增加2GB内存之后,该程序因内存不足异常而崩溃.我确实在属性页面中将目标平台设置为x64.

open System.Collections.Generic

let d = new Dictionary<int, int>()

for i=1 to 1000000000 do
    d.Add(i,i)
Run Code Online (Sandbox Code Playgroud)

我对C5集合库进行了相同的测试.结果是C5中的字典可能耗尽整个内存.代码使用C5:

let d = C5.HashDictionary<int, int> ()
for i=1 to 1000000000 do
    d.Add(i,i)
Run Code Online (Sandbox Code Playgroud)

谁知道为什么?

.net c# f# gcallowverylargeobjects

32
推荐指数
3
解决办法
2万
查看次数

map与mapM行为

我正在使用Real World Haskell的I/O章节.Monads在本书中未讨论另外7章.也就是说,我对I/O的理解充其量是不完整的.

现在我正在尝试理解mapM功能.据我所知,函数"执行"列表中的每个元素必须是"动作"(IO monad).

没有意义的是这个例子.为什么mapM返回的结果与映射相同的参数不同?

Prelude> map (\x -> [x]) [0, 1, 2]
[[0],[1],[2]]
Prelude> mapM (\x -> [x]) [0, 1, 2]
[[0,1,2]]

monads haskell map

31
推荐指数
2
解决办法
9454
查看次数

在R中生成调用图

我已经获得了大量格式不佳的单片R代码,并且有很多功能,我想知道哪些函数调用了什么函数.

我以为我可以使用roxygen的@callGraph东西,但是a)代码需要在一个包中,这将是这个代码的头疼,并且b)当我在一个简单的上运行它时它似乎不起作用我的包裹.我看到其中一位Roxygen作者发布了一条帖子,称由于Rgraphviz依赖关系而禁用了调用图生成,但代码就在那里.无论如何.

任何人都有更好的方法来快速计算foo调用bar,baz和qux,而qux调用quux?

编辑:基于R的分析系统的解决方案很棒,假设您可以实际运行代码...文件中的一半东西不会运行,我不知道它做了什么...静态分析太多了我想是希望的.

编辑2:Roxygen的调用图东西似乎做了一个静态分析,基于函数表达式的递归下降和检查is.callable.能够在任何功能上运行它会很可爱......明天我可能会玩这个...

r call-graph

30
推荐指数
1
解决办法
3636
查看次数

避免堆栈溢出(使用F#无限序列序列)

我有这个"学习代码",我为f#中的morris seq编写,它遇到堆栈溢出,我不知道如何避免."morris"返回无限序列的"看见和说出"序列(即{{1},{1,1},{2,1},{1,2,1,1},{1,1,1 ,2,2,1},{3,1,2,2,1,1},...}).

    let printList l =
        Seq.iter (fun n -> printf "%i" n) l
        printfn ""

    let rec morris s = 
        let next str = seq {
            let cnt = ref 1  // Stack overflow is below when enumerating
            for cur in [|0|] |> Seq.append str |> Seq.windowed 2 do
                if cur.[0] <> cur.[1] then
                    yield!( [!cnt ; cur.[0]] )
                    cnt := 0
                incr cnt
        }
        seq {
        yield s
        yield! morris (next s) // tail recursion, no stack …
Run Code Online (Sandbox Code Playgroud)

stack-overflow f# tail-recursion sequences

29
推荐指数
2
解决办法
2975
查看次数

为什么OCaml(+)不是多态的?

我是OCaml新手.我喜欢OCaml的速度,但我并不完全了解它的设计.例如,我希望+运算符是多态的,以支持整数,浮点等.

我们为什么需要+.

polymorphism ocaml addition

27
推荐指数
2
解决办法
3366
查看次数