在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"
我已经阅读了很多专家F#,正在构建一个实际的应用程序.在调试时,我已经习惯于传递这样的fsi命令,以使repl窗口中的内容清晰可见:
fsi.AddPrinter(fun (x : myType) -> myType.ToString())
Run Code Online (Sandbox Code Playgroud)
我想扩展它以使用printf格式化程序,所以我可以输入例如
printf "%A" instanceOfMyType
Run Code Online (Sandbox Code Playgroud)
并控制自定义类型的输出.本书暗示可以做到这一点(第93页,"可以扩展通用结构格式以适用于任何用户定义的数据类型,F#网站上涵盖的主题"),但我没有找到任何关于如何实际上实现这一点.有谁知道怎么样?它甚至可能吗?
编辑:
我应该包含一个代码示例,它是我正在处理的记录类型,例如
type myType =
{a: int}
override m.ToString() = "hello"
let t = {a=5}
printfn "%A" t
printfn "%A" (box t)
Run Code Online (Sandbox Code Playgroud)
两个印刷语句产生:
{a = 5;}
Run Code Online (Sandbox Code Playgroud) 我知道有关F#中的模块和命名空间的其他 问题,但他们现在没有帮助我.
我有一个项目
Utilities.fs
namespace Company.Project.Namespace
module Utilities =
//stuff here
Run Code Online (Sandbox Code Playgroud)
Functions.fs
namespace Company.Project.Namespace
open Utilities
module Functions =
//stuff here
Run Code Online (Sandbox Code Playgroud)
而我正试图在fsx中测试它们:
#load "Utilities.fs"
#load "Functions.fs"
Run Code Online (Sandbox Code Playgroud)
error FS0039: The namespace or module 'Utilities' is not defined当我尝试将它发送到FSI时,它给了我Alt-Enter.
我已经尝试在脚本文件的顶部添加相同的命名空间,但它不喜欢这样.
奇怪的是后台编译器没有对我大喊大叫.
这似乎有效,但它是正确的approch?
#load "Utilities.fs"
open Company.Project.Namespace
#load "Functions.fs"
Run Code Online (Sandbox Code Playgroud)
在某个地方是否有一个'参考'FSharp项目,其中包含如何集成所有这些内容的示例:命名空间,模块,类,脚本文件,测试等?
我想将F#交互式控制台与Visual Studio 2010中当前打开的解决方案中的项目一起使用.是否有一种快速简便的方法在F#交互式控制台中添加引用以引用当前打开的解决方案中的项目?
我正在使用Mac OS X/mono上的fsi学习F#,但是很难知道退出和退出shell的命令.
退出,或^ D不起作用,^ C也不起作用.停止fsi的命令是什么?
一般来说,我在哪里可以找到关于fsi的教程/用户指南?
我无法在windows或linux上运行find/run fsi.exe.它无处可寻.也许它不受支持?
我发现这篇关于使用带有正则表达式的活动模式的有用文章:http: //www.markhneedham.com/blog/2009/05/10/f-regular-expressionsactive-patterns/
文章中使用的原始代码段是:
open System.Text.RegularExpressions
let (|Match|_|) pattern input =
let m = Regex.Match(input, pattern) in
if m.Success then Some (List.tl [ for g in m.Groups -> g.Value ]) else None
let ContainsUrl value =
match value with
| Match "(http:\/\/\S+)" result -> Some(result.Head)
| _ -> None
Run Code Online (Sandbox Code Playgroud)
如果找到至少一个网址以及该网址是什么(如果我正确理解了该网址片段),会告诉您
然后在评论部分Joel建议这个修改:
替代方案,因为给定的组可能是也可能不是成功匹配:
Run Code Online (Sandbox Code Playgroud)List.tail [ for g in m.Groups -> if g.Success then Some g.Value else None ]或者,您可以为组添加标签,并希望按名称访问它们:
Run Code Online (Sandbox Code Playgroud)(re.GetGroupNames() |> Seq.map (fun n -> (n, m.Groups.[n])) |> Seq.filter (fun …
有没有办法清除VS2010中的F#交互窗口?
#cls;;并且#clear;;不工作.
退出#quit;;导致重新启动F#interactive而不清除窗口内容.
尝试使用"删除"或"退格"删除文本会显示错误消息,指出文本是只读的.
我想将一个或多个.fsx文件加载到F#interactive中,并.fsx在范围内的文件中定义所有函数,以便我可以直接使用控制台中的函数.
该#load指令执行.fsx指定的文件,但后来我不再能够在.fsx文件中使用这些函数.有什么解决方法吗?谢谢.
我已经开始使用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()在循环内部放置,但这是调试器停止的唯一行,这使我无法继续在循环内部调试行.我也没有任何局部变量:(
也许我错过了一些明显的东西?
f# ×10
f#-interactive ×10
.net ×1
.net-core ×1
breakpoints ×1
debugging ×1
linux ×1
module ×1
namespaces ×1
printf ×1
regex ×1