标签: f#

F#定义/使用同一项目中另一个文件中的类型/模块

希望这很容易.我有一个带有两个文件(Program.fs,Stack.fs)的F#项目(最新的F#CTP).在Stack.fs中,我有一个简单的命名空间和类型定义

Stack.fs

namespace Col

type Stack= 
 ...
Run Code Online (Sandbox Code Playgroud)

现在我尝试通过声明在Program.fs中包含命名空间

open Col
Run Code Online (Sandbox Code Playgroud)

这不起作用,并给我错误"未定义名称空间或模块Col".然而,它是在同一个项目中定义的.我必须遗漏一些明显的东西

f#

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

应用风格的实际用途是什么?

我是Scala程序员,现在正在学习Haskell.很容易找到OO概念的实际用例和现实世界的例子,例如装饰器,策略模式等.书籍和互联网都充满了它.

我开始意识到这在某种程度上不是功能概念的情况.例证:申请人.

我正在努力寻找应用程序的实际用例.到目前为止,我遇到的几乎所有教程和书籍都提供了[]和的示例Maybe.我希望应用程序比这更适用,看到他们在FP社区中得到的所有关注.

我认为我理解申请人的概念基础(也许我错了),而且我已经等待了很长一段时间的启蒙.但它似乎并没有发生.从来没有在编程的时候,我有一个时刻,我会高兴地喊,"尤里卡!我可以在这里使用应用程序!" (再次,除了[]Maybe).

有人可以指导我如何在日常编程中使用应用程序吗?如何开始发现模式?谢谢!

f# haskell functional-programming scala applicative

68
推荐指数
8
解决办法
6557
查看次数

为什么F#的类型推断如此变幻无常?

F#编译器似乎以(相当)严格的从上到下,从左到右的方式执行类型推断.这意味着您必须执行诸如在使用之前放置所有定义,文件编译的顺序很重要,并且您倾向于需要重新排列内容(通过|>或有什么)以避免使用显式类型注释.

如何使这更灵活,并且计划用于F#的未来版本有多难?显然它可以完成,因为Haskell(例如)没有这种限制同样强大的推理.F#的设计或意识形态是否有任何本质上的不同?

f# type-inference language-design

67
推荐指数
5
解决办法
4246
查看次数

方便的F#片段

关于F#/功能片段已经存在两个 问题.

然而,我在这里寻找的是有用的片段,可重复使用的小"帮助"功能.或者模糊但又漂亮的模式,你永远不会记得.

就像是:

open System.IO

let rec visitor dir filter= 
    seq { yield! Directory.GetFiles(dir, filter)
          for subdir in Directory.GetDirectories(dir) do 
              yield! visitor subdir filter} 
Run Code Online (Sandbox Code Playgroud)

我想把它作为一个方便的参考页面.因此,没有正确的答案,但希望有很多好的答案.

EDIT Tomas Petricek专门为F#片段创建了一个网站http://fssnip.net/.

f# reference code-snippets

66
推荐指数
15
解决办法
1万
查看次数

函数式编程中"无点"风格的优缺点是什么?

我知道在某些语言(Haskell?)中,努力是实现无点样式,或者永远不要通过名称显式引用函数参数.这对我来说是一个非常难以掌握的概念,但它可以帮助我理解这种风格的优点(或者甚至是缺点).谁能解释一下?

f# functional-programming pointfree

66
推荐指数
3
解决办法
4311
查看次数

如何编组多维数组

我们有一些涉及矩阵的互操作代码.我试图调用本机DLL,并且在大多数情况下它的工作非常可靠.

我依赖.net默认编组,避免使用非托管指针,而不是大部分使用.net数组,也许是byref在这里和那里..net文章说,多维数组被隐式编组为列主要的一维数组,这很好.

唯一似乎不起作用的是尝试编组多维数组,因为F#编译器抱怨声明中float[,]不允许这样做extern.这种限制有什么办法吗?

我知道F#PowerPack的类型PinnedArrayPinnedArray2类型,但我一直在寻找依赖于托管指针的解决方案 - 更重要的是 - 我希望避免将F#PowerPack作为依赖项包含在PinnedArray类中.

.net f# marshalling multidimensional-array

66
推荐指数
1
解决办法
1657
查看次数

在F#中使用`inline`

inline在我看来,F#中的关键字与我在例如C中使用的目的有些不同.例如,它似乎影响函数的类型(什么是"静态解析的类型参数"?不是所有的F#类型静态解决?)

inline什么时候应该使用功能?

f# types inline

64
推荐指数
4
解决办法
7509
查看次数

将选项类型列表缩减为仅非元素的最佳方法?

从一个选项列表到一个只包含Some的元素的列表,我出乎意料地遇到了一些麻烦.

我最初的尝试是:

    let ga = List.filter (fun xx ->
        match xx with
        | Some(g) -> true
        | None -> false) gao 
Run Code Online (Sandbox Code Playgroud)

但是,当然,这种结果类型仍然是一个选项列表.我不知道如何使用List.map来压缩它,因为你必须处理匹配语句中的所有情况.我有一个丑陋的解决方案,但我想知道是否有更好的东西.

丑陋:

    let rec gOptRemove gdec gacc = 
        match gdec with 
        | head :: tail -> 
            match head with 
            | Some(a) -> gOptRemove tail (a :: gacc)
            | None -> gOptRemove tail gacc
        | [] -> gacc
Run Code Online (Sandbox Code Playgroud)

我更愿意找到一个非递归的解决方案或找出这种事情的标准方法.

f# functional-programming

62
推荐指数
1
解决办法
8159
查看次数

F#在产卵和杀戮过程中真的比Erlang快吗?

更新:此问题包含一个错误,使基准无意义.我将尝试更好的基准比较F#和Erlang的基本并发功能,并在另一个问题中查询结果.

我正在尝试了解Erlang和F#的性能特征.我发现Erlang的并发模型非常吸引人,但我倾向于使用F#来实现互操作性.虽然开箱即用F#不提供像Erlang的并发原语 - 从我可以告诉async和MailboxProcessor只涵盖Erlang做得很好的一小部分 - 我一直试图了解F#性能的可能性明智的.

在Joe Armstrong的Programming Erlang一书中,他指出Erlang中的进程非常便宜.他使用(大致)以下代码来证明这一事实:

-module(processes).
-export([max/1]).

%% max(N) 
%%   Create N processes then destroy them
%%   See how much time this takes

max(N) ->
    statistics(runtime),
    statistics(wall_clock),
    L = for(1, N, fun() -> spawn(fun() -> wait() end) end),
    {_, Time1} = statistics(runtime),
    {_, Time2} = statistics(wall_clock),
    lists:foreach(fun(Pid) -> Pid ! die end, L),
    U1 = Time1 * 1000 / N,
    U2 = Time2 * 1000 / N,
    io:format("Process spawn time=~p (~p) microseconds~n",
          [U1, U2]).

wait() -> …
Run Code Online (Sandbox Code Playgroud)

concurrency erlang f# actor

61
推荐指数
2
解决办法
7617
查看次数

F#vs OCaml:堆栈溢出

我最近在Python程序员面前发现了一个关于F#的演示文稿,看了之后,我决定自己实现"蚂蚁拼图"的解决方案.

有一只蚂蚁可以在平面网格上走动.蚂蚁可以一次向左,向右,向上或向下移动一个空间.也就是说,从单元格(x,y),蚂蚁可以进入单元格(x + 1,y),(x-1,y),(x,y + 1)和(x,y-1).蚂蚁无法访问x和y坐标的数字之和大于25的点.例如,点(59,79)是不可访问的,因为5 + 9 + 7 + 9 = 30,大于25.问题是:如果从(1000,1000)开始,蚂蚁可以访问多少个点,包括(1000,1000)本身?

首先在30行OCaml中实现了我的解决方案,并尝试了它:

$ ocamlopt -unsafe -rectypes -inline 1000 -o puzzle ant.ml
$ time ./puzzle
Points: 148848

real    0m0.143s
user    0m0.127s
sys     0m0.013s
Run Code Online (Sandbox Code Playgroud)

整洁,我的结果与leonardo在D和C++中的实现相同.与leonardo的C++实现相比,OCaml版本的运行速度比C++慢大约2倍.这是好的,因为leonardo使用队列来删除递归.

然后我将代码翻译成F# ......这就是我得到的:

Thanassis@HOME /g/Tmp/ant.fsharp
$ /g/Program\ Files/FSharp-2.0.0.0/bin/fsc.exe ant.fs
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

Thanassis@HOME /g/Tmp/ant.fsharp
$ ./ant.exe

Process is terminated due to StackOverflowException.
Quit …
Run Code Online (Sandbox Code Playgroud)

stack-overflow f# ocaml tail-recursion

61
推荐指数
2
解决办法
1万
查看次数