在F#interactive中,我可以String.Join("+", ["a"; "b"])
成功使用,但是
["a"; "b"] |> String.Join "+"
Run Code Online (Sandbox Code Playgroud)
产生错误:
Script1.fsx(79,15): error FS0001: This expression was expected to have type
string list -> 'a
but here has type
string
Run Code Online (Sandbox Code Playgroud)
如何String.Join
使用管道传递集合?
PS同样的问题是 lines |> File.WriteAllLines "filename.txt"
我已经开始使用VS2010和F#interactive研究算法中的一些想法.
所以,我创建了一个DebugScript.fsx
,我在那里写了一些代码并最终将它发送给F#Int进行测试.
在某些时候我需要抓住一个bug.但即使在一个简单的for
循环中,我也无法设置断点:
for i in stringarray do
printfn "%s" i
Run Code Online (Sandbox Code Playgroud)
当我按F9设置断点时,VS会显示一个带有警告标志的红色圆圈.它的提示是"断点当前不会被击中".
当然,我确实打开了Debug菜单 - > Attach to process ... - > Fsi.exe
我尝试Debugger.Break()
在循环内部放置,但这是调试器停止的唯一行,这使我无法继续在循环内部调试行.我也没有任何局部变量:(
也许我错过了一些明显的东西?
我正在重新编写可以多次启动的Java可执行文件,我希望一次一个进程.在C#中,我会使用命名/系统Mutex执行此操作,但这在Java中似乎不可能.我该如何实现此功能?
我来自C#背景到F#.到目前为止,我编写了简单的程序,并在F#interactive中花了很多时间.
我很难创建一个带有两个.fs文件的VS F#项目.
示例代码:
// part 1: functions
let rec gcd (a : uint64) (b : uint64) =
if b = 0UL then a
else gcd b (a % b)
// part 2: main()
let a, b = (13UL, 15UL)
do printfn "gcd of %d %d = %d" a b (gcd a b)
Run Code Online (Sandbox Code Playgroud)
我想要两个.fs文件,即Alg.fs和Program.fs,这样Program.fs将包含我正在使用的代码和具有算法的Alg.fs.
采取的步骤:
我已经创建了两个文件.编译器给出了一个错误:Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'
我已插入module Program
和 …
我目前使用这个功能
let inc (i : int ref) =
let res = !i
i := res + 1
res
Run Code Online (Sandbox Code Playgroud)
写点东西
let str = input.[inc index]
Run Code Online (Sandbox Code Playgroud)
如何定义增量运算符++,以便我可以编写
let str = input.[index++]
Run Code Online (Sandbox Code Playgroud) 我正在尝试定期执行某项操作.我想创建一个类的新实例,比如说,持续3秒.最好通过使用Handler或Thread来实现它吗?我可以尝试一种更容易,更笨拙的方式吗?我真的不擅长使用线程 - 我想学习,但更重要的是我要在完成编程实践之前让它运行起来.
new Thread(){
public void run(){
//makes sure the player still has 3 lives left
while(game == false){
uiCallback.sendEmptyMessage(0);
try {
Thread.sleep(2000); // wait two seconds before drawing the next flower
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //sleep for 2 seconds
}
}
}.start();
Run Code Online (Sandbox Code Playgroud) 一点介绍:
类包含字段和方法(这次让我跳过属性).
字段表示类的状态.
方法描述了类的行为.
在设计良好的类中,如果类抛出异常,方法不会改变类的状态,对吧?(换句话说,无论发生什么,类的状态都不应该被破坏)
题:
是否有框架,设计模式,最佳实践或编程语言来调用事务样式中的一系列方法,以便任何类的状态都不会被更改(如果是异常),或者一切都成功了?
例如:
// the class foo is now in the state S1
foo.MoveToState2();
// it is now (supposed to be) in the state S2
foo.MoveToFinalState();
// it is now (supposed to be) in the state, namely, S3
Run Code Online (Sandbox Code Playgroud)
当然,在MoveToState2()
和中可能会发生异常MoveToFinalState()
.但是从这段代码中我希望类foo
处于状态S1或S3.
这是一个简单的场景,涉及单个类,没有if
,没有while
,没有副作用,但我希望这个想法很清楚.
我想创建一个带有'a'..'z'值(包括)的向量.
这不编译:
let vec: Vec<char> = ('a'..'z'+1).collect();
Run Code Online (Sandbox Code Playgroud)
什么是惯用的方式'a'..'z'
?
我正在尝试用CUDA.Net编写一个幼稚的应用程序,但我运气不好.
我已经想到了:
using GASS.CUDA;
// ...
var c = new CUDA();
// c.Launch(myfunc); // ???? how ???
Run Code Online (Sandbox Code Playgroud)
myfunc
显然应该是类型,GASS.CUDA.Types.CUfunction
但我没有找到如何定义一个.
由于我使用F#进行研究(特别是使用F#interactive),我希望能够切换"print-when-in-debug"功能.
我可以
let dprintfn = printfn
Run Code Online (Sandbox Code Playgroud)
F#互动说
val dprintfn : (Printf.TextWriterFormat<'a> -> 'a)
Run Code Online (Sandbox Code Playgroud)
我可以使用
dprintfn "myval1 = %d, other val = %A" a b
Run Code Online (Sandbox Code Playgroud)
每当我想要我的脚本.
现在我想以dprintfn
不同的方式定义,以便它会忽略所有与语法兼容的参数printfn
.怎么样?
我想到的最接近(但不起作用)的变体是:
let dprintfn (arg: (Printf.TextWriterFormat<'a> -> 'a)) = ()
Run Code Online (Sandbox Code Playgroud)
但它以下不编译然后dprintfn "%A" "Hello"
导致error FS0003: This value is not a function and cannot be applied
.
PS我目前使用别名Debug.WriteLine(...)
作为解决方法,但问题仍然是有趣的F#类型系统.