小编Ono*_*cci的帖子

F#可选记录字段

我有一个F#记录类型,并希望其中一个字段是可选的:

type legComponents = {
    shares : int<share> ;
    price : float<dollar / share> ;
    totalInvestment : float<dollar> ;
}

type tradeLeg = {
    id : int ;
    tradeId : int ;
    legActivity : LegActivityType ;
    actedOn : DateTime ;
    estimates : legComponents ;
    ?actuals : legComponents ; 
}
Run Code Online (Sandbox Code Playgroud)

在tradeLeg类型中,我希望actuals字段是可选的.我似乎无法弄明白,也无法在网上找到可靠的例子.看起来这应该很容易

let ?t : int = None
Run Code Online (Sandbox Code Playgroud)

但我真的似乎无法让这个工作.呃 - 谢谢你

Ť

f# record optional

13
推荐指数
2
解决办法
4152
查看次数

Nemerle和F#的比较功能On .Net

社区维基问题:

根据这个问题:在.Net中使用Scala有什么好处?另一个问题浮现在脑海中.任何人都可以在.Net平台上列出Nemerle和F#的功能开发的比较优势(和劣势)吗?我刚刚看过Nemerle.听起来它和F#在同一个场地玩得很好,所以我想知道除了显而易见的语法差异和F#支持微软的巨大优势之外还有什么区别.

.net f# functional-programming nemerle

13
推荐指数
2
解决办法
2584
查看次数

如何使用Sprintf作为格式字符串的变量?

因为不得不问这个问题,我觉得自己像个总菜鸟,但这让我很难过.

我设置了这样的格式字符串:

let fs = "This is my format test %s"
Run Code Online (Sandbox Code Playgroud)

然后我试着像这样使用它:

let s = sprintf fs "testing"
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我收到此错误:

//stdin(26,17): error FS0001: The type 'string' is not compatible with the type 'Printf.StringFormat<('a -> 'b)>'
Run Code Online (Sandbox Code Playgroud)

所以我接着尝试了这个:

let s = sprintf (Printf.StringFormat fs) "test"
Run Code Online (Sandbox Code Playgroud)

REPL回复的内容:

//stdin(28,18): error FS1124: Multiple types exist called 'StringFormat', taking different numbers of generic parameters. Provide a type instantiation to disambiguate the type resolution, e.g. 'StringFormat<_>'.
Run Code Online (Sandbox Code Playgroud)

所以我接着尝试了这个:

let s = sprintf (Printf.StringFormat<string> fs) "test" 
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

//stdin(29,18): error FS0001: …
Run Code Online (Sandbox Code Playgroud)

f# f#-interactive

13
推荐指数
1
解决办法
2128
查看次数

F#函数多次退出

我可以在C++中轻松地做到这一点(注意:我没有测试它的正确性 - 它只是为了说明我正在尝试做什么):

   const int BadParam = -1;
   const int Success = 0;

   int MyFunc(int param)
   {
      if(param < 0)
      {
         return BadParam;
      }

      //normal processing

      return Success;
   }
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何在F#早期退出例行程序.我想要做的是在输入错误时退出该功能,但如果输入正常则继续.我错过了F#的一些基本属性,还是因为我刚刚学习FP而以错误的方式解决问题?是failwith我在这里唯一的选择?

这是我到目前为止所得到的,它编译好了:

   #light

   module test1

       (* Define how many arguments we're expecting *)
       let maxArgs = 2;;
       (* The indices of the various arguments on the command line *)
       type ProgArguments =
           | SearchString = 0
           | FileSpec = 1;;

       (* Various errorlevels which the app can return and …
Run Code Online (Sandbox Code Playgroud)

f# idioms structure

12
推荐指数
3
解决办法
4141
查看次数

函数式编译器优于命令式语言编译器的优点

作为对这个问题的跟进,F#内置不变性对C#有什么好处?--am我正确地假设F#编译器可以在知道它处理很大程度上不可变的代码时进行某些优化吗?我的意思是即使开发人员写了"Functional C#",编译器也不会知道开发人员试图编写的所有不可变性,因此它无法进行相同的优化,对吧?

通常情况下,函数式语言的编译器能够进行使用命令式语言无法实现的优化 - 即使是尽可能多的不可变写的语言编写的吗?

c# f# functional-programming compiler-theory

12
推荐指数
4
解决办法
1614
查看次数

F#中哪些容易在C#中很难?

可能重复:
在哪些方面,F#的使用可能比C#更合适?

我期待在本地的.Net用户组上发表关于F#的演讲.我期待"我为什么要调查F#?" 来自观众的问题.我知道在F#中可以完成的大部分工作也可以在C#中完成 - 所以我正在寻找可以在F#中轻松完成的事情,这在C#中很难做到(例如模式匹配).如果这个问题已经有了很好的答案,请在评论中将它们链接起来,我会将其关闭.我确实看到了一些东西,但如果已经有一个问题解决了这个问题,我就找不到了.

顺便说一句,如果任何主持人想要标记这个社区维基,请随意; 无论如何,这似乎更像是一个调查问题.

c# f#

11
推荐指数
2
解决办法
815
查看次数

如何将Elixir二进制转换为字符串?

所以我试图将二进制文件转换为字符串.这段代码:

t = [{<<71,0,69,0,84,0>>}]
String.from_char_list(t)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这种转换时,我得到了这个:

** (ArgumentError) argument error
    (stdlib) :unicode.characters_to_binary([{<<70, 0, 73, 0, 78, 0>>}])
    (elixir) lib/string.ex:1161: String.from_char_list/1
Run Code Online (Sandbox Code Playgroud)

我假设<< 70,0等可能是一个字形列表(它是API调用的返回,并且API没有完全记录)但我是否需要以某种方式指定编码?

我知道我可能会遗漏一些明显的东西(也许这不是正确的功能?)但我似乎无法弄清楚该怎么做.


编辑:

对于它的价值,上面的二进制文件是Erlang ODBC调用的返回值.经过一番挖掘后,我发现有问题的二进制文件实际上是"编码为UTF16小端的Unicode二进制文件"(参见此处:http://www.erlang.org/doc/apps/odbc/odbc.pdf第9页) re:SQL_WVARCHAR)并没有真正改变问题,但它确实添加了一些上下文.

unicode erlang odbc elixir

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

如何为单字母ASCII字符串(值0-127)进行typepec?

同样,我怎样才能为"单一"UTF8字符打字?

在类型定义中,我可以使用泛型"any string"或"any utf8 string"

@type tile :: String.t # matches any string
@type tile :: <<_::8>> # matches any single byte
Run Code Online (Sandbox Code Playgroud)

但似乎我无法匹配第一位为0

@type tile :: <<0::1, _::7>>
Run Code Online (Sandbox Code Playgroud)

单个UTF比特序列的情况是

@type tile :: <<0::1, _::7>> | 
              <<6::3, _::5, 2::2, _::6>> | 
              <<14::4, _::4, 2::2, _::6, 2::2, _::6>> |
              <<30::5, _::3, 2::2, _::6, 2::2, _::6, 2::2, _::6>>
Run Code Online (Sandbox Code Playgroud)

(例如,当使用模式匹配时,这些位模式匹配

<<14::4, _::4, 2::2, _::6, 2::2, _::6>> = "?"
Run Code Online (Sandbox Code Playgroud)

成功.)

但是当在typespecs中使用时,编译器会抱怨很多

== Compilation error in file lib/board.ex ==
** (ArgumentError) argument error
    (elixir) lib/kernel/typespec.ex:1000: Kernel.Typespec.typespec/3 …
Run Code Online (Sandbox Code Playgroud)

erlang elixir dialyzer

11
推荐指数
1
解决办法
353
查看次数

何时使用Gen_Fsm以及何时使用Gen_Server?

在检查Gen_Fsm和Gen_Server文档后,我发现它们或多或少地表现为类似的行为.在我看来,如果有一个循环函数用于发送广播或监听tcp sock,最好使用Gen_Fsm,否则使用gen_server.我想知道它是否正确?

erlang gen-server gen-fsm

10
推荐指数
1
解决办法
2509
查看次数

如何否定管道中的布尔值?

请考虑以下代码:

defmodule T do
  def does_not_contain?(s, t) do
    s |> not(String.contains?(t))
  end
end
Run Code Online (Sandbox Code Playgroud)

这会在编译时出现以下错误:

** (CompileError) iex:3: undefined function not/2
Run Code Online (Sandbox Code Playgroud)

我也试过这样的结构:

defmodule T do
  def does_not_contain?(s, t) do
    s |> String.contains?(t) |> not
  end
end
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

** (SyntaxError) iex:4: unexpected token: end
Run Code Online (Sandbox Code Playgroud)

我可以做这样的工作:

defmodule T do
  def does_not_contain?(s, t) do
    does_contain = s |> String.contains?(t)
    not(does_contain)
  end
end
Run Code Online (Sandbox Code Playgroud)

但尝试将整个事情保持在管道中是非常有吸引力的.有没有办法在管道中否定一个布尔值?

elixir

9
推荐指数
1
解决办法
1337
查看次数