我有一个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)
但我真的似乎无法让这个工作.呃 - 谢谢你
Ť
社区维基问题:
根据这个问题:在.Net中使用Scala有什么好处?另一个问题浮现在脑海中.任何人都可以在.Net平台上列出Nemerle和F#的功能开发的比较优势(和劣势)吗?我刚刚看过Nemerle.听起来它和F#在同一个场地玩得很好,所以我想知道除了显而易见的语法差异和F#支持微软的巨大优势之外还有什么区别.
因为不得不问这个问题,我觉得自己像个总菜鸟,但这让我很难过.
我设置了这样的格式字符串:
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) 我可以在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#内置不变性对C#有什么好处?--am我正确地假设F#编译器可以在知道它处理很大程度上不可变的代码时进行某些优化吗?我的意思是即使开发人员写了"Functional C#",编译器也不会知道开发人员试图编写的所有不可变性,因此它无法进行相同的优化,对吧?
通常情况下,函数式语言的编译器能够进行使用命令式语言无法实现的优化 - 即使是尽可能多的不可变写的语言编写的吗?
可能重复:
在哪些方面,F#的使用可能比C#更合适?
我期待在本地的.Net用户组上发表关于F#的演讲.我期待"我为什么要调查F#?" 来自观众的问题.我知道在F#中可以完成的大部分工作也可以在C#中完成 - 所以我正在寻找可以在F#中轻松完成的事情,这在C#中很难做到(例如模式匹配).如果这个问题已经有了很好的答案,请在评论中将它们链接起来,我会将其关闭.我确实看到了一些东西,但如果已经有一个问题解决了这个问题,我就找不到了.
顺便说一句,如果任何主持人想要标记这个社区维基,请随意; 无论如何,这似乎更像是一个调查问题.
所以我试图将二进制文件转换为字符串.这段代码:
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)并没有真正改变问题,但它确实添加了一些上下文.
同样,我怎样才能为"单一"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) 在检查Gen_Fsm和Gen_Server文档后,我发现它们或多或少地表现为类似的行为.在我看来,如果有一个循环函数用于发送广播或监听tcp sock,最好使用Gen_Fsm,否则使用gen_server.我想知道它是否正确?
请考虑以下代码:
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)
但尝试将整个事情保持在管道中是非常有吸引力的.有没有办法在管道中否定一个布尔值?