此代码在FF中运行良好,它会将用户带回上一页,但不会在Chrome中:
<a href="www.mypage.com" onclick="javascript:history.go(-1)"> Link </a>
Run Code Online (Sandbox Code Playgroud)
有什么问题?
我经常读到异常有点慢,如果性能是一个问题应该避免(例如,在Java,F#等).这是否适用于常见的OCaml函数,例如Hashtbl.find,返回未找到元素的异常?
特别是,如果我希望我的应用程序有效,我应该总是使用,例如,Hashtable.mem在调用之前测试元素成员资格Hashtbl.find吗?或者mem功能的额外比较是否会对性能产生负面影响?
我有一个页面,其中有几个搜索/过滤按钮,当点击时,通过AJAX刷新下面列表的内容.
在这个过程中,我正在修改历史记录(通过pushstate),以便新的过滤页面可以添加书签,因此后退按钮可以正常工作.我也在听popstate事件,对Back做出反应.
我的代码看起来或多或少像这样:
window.addEventListener("popstate", function(ev) {
if (!window.history_ready) { return; } // Avoid the one time it runs on load
refreshFilter(window.location.href, true);
});
refreshFilter: function(newURL, backButtonPressed){
$.ajax({ url: newURL}).done( blah );
if (!backButtonPressed) {
window.history_ready = true;
history.pushState(null, null, newURL);
}
}
Run Code Online (Sandbox Code Playgroud)
除了一个奇怪的案例外,这种方法效果很好......
至少在最新的Chrome中
为什么会发生这种情况,我该如何避免呢?
我编写了这段代码,它在VS.NET 2010中编译并完美地运行
module ConfigHandler
open System
open System.Xml
open System.Configuration
let GetConnectionString (key : string) =
ConfigurationManager.ConnectionStrings.Item(key).ConnectionString
Run Code Online (Sandbox Code Playgroud)
但是,当我执行控制+ A和Alt + Enter将其发送到FSI时,我收到错误
ConfigHandler.fs(2,1):错误FS0010:定义中结构化构造的意外启动.预期'='或其他令牌.
好.
所以我将我的代码更改为
module ConfigHandler =
open System
open System.Xml
open System.Configuration
let GetConnectionString (key : string) =
ConfigurationManager.ConnectionStrings.Item(key).ConnectionString
Run Code Online (Sandbox Code Playgroud)
现在Control + A,Alt + Enter成功了,我很好地告诉我FSI
module ConfigHandler = begin val GetConnectionString:string - > string end
但是现在如果我尝试在VS.NET 2010中编译我的代码,我会收到一条错误消息
库或多文件应用程序中的文件必须以命名空间或模块声明开头,例如'namespace SomeNamespace.SubNamespace'或'module SomeNamespace.SomeModule'
我怎么能两个都有?能否在VS.NET中编译并能够将模块发送到FSI?
我试图在F#中编写非阻塞代码.我需要下载一个网页,但有时该网页不存在,AsyncDownloadString会抛出异常(404 Not Found).我尝试了下面的代码,但它没有编译.
我怎么能处理AsyncDownloadString的异常?
let downloadPage(url: System.Uri) = async {
try
use webClient = new System.Net.WebClient()
return! webClient.AsyncDownloadString(url)
with error -> "Error"
}
Run Code Online (Sandbox Code Playgroud)
我怎么想在这里处理异常?如果抛出错误,我只想返回一个空字符串或带有消息的字符串.
我有一个元组列表int*string其中int是level,string是name
let src = [
(0, "root");
(1, "a");
(2, "a1");
(2, "a2");
(1, "b");
(2, "b1");
(3, "b11");
(2, "b2");
]
Run Code Online (Sandbox Code Playgroud)
我需要将其转换为以下内容
let expectingTree =
Branch("root",
[
Branch("a",
[
Leaf("a1");
Leaf("a2")
]);
Branch("b",
[
Branch("b1", [Leaf("b11")]);
Leaf("b2")
]);
]);
Run Code Online (Sandbox Code Playgroud)
以下是我如何做到的方式,但任何人都可以通过更好的方式来实现这一目标.我是F#的新手,做同样事情的C#代码会更短,所以我想我错了.
type Node =
| Branch of (string * Node list)
| Leaf of string
let src = [
(0, "root");
(1, "a");
(2, "a1");
(2, "a2");
(1, "b");
(2, "b1");
(3, "b11");
(2, "b2");
]
let rec setParents (level:int) …Run Code Online (Sandbox Code Playgroud) 我找了很长时间没有成功解决这个问题的方法.
我正在将一些C#代码移植到F#,我正在为一个WPF元素的Dispatcher.Invoke而苦苦挣扎.由于我是F#中的总菜鸟,我唯一能确定的是问题出在椅子和键盘之间.
这是我的C#代码:
foreach (var k in ChartList.Keys)
{
ChartList[k].Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
ChartList[k].Width = area.Width / totalColsForm;
ChartList[k].Height = area.Height / totalRowsForm;
ChartList[k].Left = area.X + ChartList[k].Width * currentCol;
ChartList[k].Top = area.Y + ChartList[k].Height * currentRow;
ChartList[k].doShow();
}
));
}
Run Code Online (Sandbox Code Playgroud)
我正在努力的部分是新的Action(delegate()...).编译器不喜欢我试图翻译它.
F#中这个片段的翻译是什么?
我正在尝试从F#访问外部DLL函数.这个让我真的很汗.
C头是:
ext_def(int32) swe_calc_ut(double tjd_ut, int32 ipl, int32 iflag,
double *xx, char *serr);
Run Code Online (Sandbox Code Playgroud)
我相应地在F#中导入了它:
extern int32 ext_swe_calc_ut(double tjd_ut, int32 ipl, int32 iflag, double *xx, StringBuilder serr);
Run Code Online (Sandbox Code Playgroud)
问题是阵列部分.我尝试了来自F#Powerpack的PinnedArray,但是呼叫仍然失败.char数组可能没问题,即使我无法检查,因为调用失败了.
到目前为止它是:
open System
open System.Runtime.InteropServices
open System.Text
open Microsoft.FSharp.NativeInterop
#r "FSharp.PowerPack.dll"
#nowarn "51"
module Sweph =
[<DllImport(@"swedll32.dll", CharSet = CharSet.Ansi, EntryPoint = "swe_calc_ut")>]
extern int32 ext_swe_calc_ut(double tjd_ut, int32 ipl, int32 iflag, double *xx, StringBuilder serr);
/// <param name="jdnr">Julian day</param>
/// <returns>Array with 6 doubles: 0:longitude, 1:latitude, 2:distance,3:speel in longitude,
/// 4: speed in …Run Code Online (Sandbox Code Playgroud) 我有以下F#程序从互联网上检索网页:
open System.Net
[<EntryPoint>]
let main argv =
let mutable pageData : byte[] = [| |]
let fullURI = "http://www.badaddress.xyz"
let wc = new WebClient()
try
pageData <- wc.DownloadData(fullURI)
()
with
| :? System.Net.WebException as err -> printfn "Web error: \n%s" err.Message
| exn -> printfn "Unknown exception:\n%s" exn.Message
0 // return an integer exit code
Run Code Online (Sandbox Code Playgroud)
这工作得很好,如果 URI是有效的并且该机拥有互联网连接和 Web服务器等正确响应在一个理想的函数式编程的世界函数的结果将不依赖于外部变量不作为参数(副作用)通过.
我想知道的是什么是适当的F#设计模式来处理可能需要该函数来处理可恢复的外部错误的操作.例如,如果网站关闭,可能需要等待5分钟再试一次.是否应该显式传递重试次数和重试之间的延迟等参数,或者将这些变量嵌入函数中是否可以?
我有这个特殊的问题,我还没有解决方案.我认为如果我知道它存在一个相关的算法会有所帮助.
我正在寻找的算法是帮助找到满足函数返回的目标的参数的算法.
例如,a works for b表示为(a,b)
Given: [ (a,b); (b,c) ]
Run Code Online (Sandbox Code Playgroud)
函数works将确保它们与布尔值的关系
let works a b -> true
let works b c -> true
Run Code Online (Sandbox Code Playgroud)
现在我得到了
[ (a, "x"); ("x", c) ]
Run Code Online (Sandbox Code Playgroud)
如果我想要这两个绑定是真的,那么这个函数必须为true
let works a "x" -> true
let works "x" c -> true
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试编写一个帮助我实现这一目标的函数/算法 "x" = b
我在考虑回溯,但还不知道如何实现它.如果有人能给我提示,我将不胜感激.
作为旁注,我正在使用函数式编程范例在F#中实现该算法.
f# ×8
algorithm ×2
arrays ×1
back-button ×1
dispatcher ×1
external ×1
f#-async ×1
html5 ×1
hyperlink ×1
javascript ×1
ocaml ×1
performance ×1
pinvoke ×1
prolog ×1
recursion ×1
tree ×1
unification ×1
webclient ×1
wpf ×1