有一个常见的问题是F#本身不支持在Haskell中使用的函数的中缀式使用:
isInfixOf :: Eq a => [a] -> [a] -> Bool
isInfixOf "bar" "foobarbaz"
"bar" `isInfixOf` "foobarbaz"
Run Code Online (Sandbox Code Playgroud)
可以在此处找到最着名的F#解决方案:
let isInfixOf (what:string) (where:string) =
where.IndexOf(what, StringComparison.OrdinalIgnoreCase) >= 0
let found = "bar" |>isInfixOf<| "foobarbaz"
Run Code Online (Sandbox Code Playgroud)
此外,使用本机运算符优先级很容易改进它:
let ($) = (|>)
let (&) = (<|)
let found = "bar" $isInfixOf& "foobarbaz"
Run Code Online (Sandbox Code Playgroud)
还有XML-ish </style/>,在这里描述.
我想找到一个更好的解决方案,具有以下标准:
它不应该破坏关联性(支持链接):
let found = "barZZZ" |>truncateAt<| 3 |>isInfixOf<| "foobarbaz"
Run Code Online (Sandbox Code Playgroud)可选地,它应该支持带元组的函数:
let isInfixOf (what:string, where:string) = ...
// it will not …Run Code Online (Sandbox Code Playgroud)我正在尝试使用给定的增量在两个值之间进行插值.
[ 1.0 .. 0.5 .. 20.0 ]
Run Code Online (Sandbox Code Playgroud)
编译器告诉我这已被弃用,并建议使用ints然后转换为float.但是如果我有一个小数增量,这似乎有点啰嗦 - 我是否必须将我的开始值和结束值除以我的增量,然后再将多次除以?(yeuch!).
我曾经看过一些关于使用序列理解来做这件事的事情,但我不记得是怎么回事.
请帮忙.
在http://diditwith.net上,我看到,在F#中,并不是必须将参数传递给否则需要它们的函数.该语言将自动将结果和输出参数填充到元组中.(!)
这是语言的一般机制的某种副作用(请原谅双关语),还是F#规范中特别明确表达并故意编程到语言中的特征?
这是一个很棒的功能,如果它被明确地放入F#中,那么我想知道这种语言中潜藏的其他金块是什么,因为我已经浏览了几十个网页并阅读了三本书(由D Syme,T.Petricek和C. Smith)我根本没有看到这个特别的提法.
编辑:正如Petricek先生在下面回答的那样,他确实在他的书" 真实世界功能编程"中至少提到了两个地方.我的错.
我找到了一个快速的项目,我认为这对于学习F#是完美的.然而,由于某种原因,我无法将我的大脑包裹起来.经过几个小时的教程,甚至一些电影,我仍然只是......不明白.
所以我想使用Enterprise Manager"Generate Scripts"开始在工作中对我们的存储过程进行版本控制,并希望删除脚本日期.我放弃了,并在C#中做到了,但现在我真的很好奇,并希望有一些见解.
我不是空手而归,这是我的C#代码:
string path = @"C:\Subversion\CompanyName\SQL\DBName";
string fileSpec = "*.sql";
string pattern = @"Script Date: \d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}";
string replace = "Script Date: ";
foreach (var file in Directory.EnumerateFiles(path, fileSpec))
{
string content = File.ReadAllText(file);
content = Regex.Replace(content, pattern, replace);
File.WriteAllText(file, content, Encoding.Unicode);
}
Run Code Online (Sandbox Code Playgroud)
我猜在F#中有一些很酷的2-3线解决方案...我很乐意看到它.
Thx的提示!我更新了它以匹配下面的内容,使视觉比较更具启发性.下面还有很棒的评论.
else语句之前的行显然是期待一个单元但是得到了一个布尔值.我刚刚开始使用F#,但无法理解这一点.
我正在打架布局,因为我之前从未使用过Stackoverflow,而且代码框仍然让我感到困惑!我相信,原件中的间距是正确的.
let m = Dictionary<int, int>()
let rec fib i =
match i with
| 1 -> i
| 0 -> i
| _ ->
if m.ContainsKey(i) then
if m.[i] > 0 then
m.[i]
else
let x = fib(i - 1) + fib(i - 2)
m.Add(i, x)
m.[i]
Run Code Online (Sandbox Code Playgroud)
如果有人能告诉我如何在这些帖子中保持间距,我将不胜感激!
假设我有n个数组,其中n是一个变量(某个数字大于2,通常小于10).
每个数组都有k个元素.
我还有一个长度为n的数组,其中包含一组权重,用于指示我如何线性组合所有数组.
我正在尝试创建一个高性能的高阶函数,以便在F#中组合这些数组.
我怎么能这样做,以便我得到一个函数,它接受一个数组(arrs是一个样本),一个权重数组(权重),然后根据权重计算一个加权和?
let weights = [|.6;;.3;.1|]
let arrs = [| [|.0453;.065345;.07566;1.562;356.6|] ;
[|.0873;.075565;.07666;1.562222;3.66|] ;
[|.06753;.075675;.04566;1.452;3.4556|] |]
Run Code Online (Sandbox Code Playgroud)
谢谢你的想法.