引用Scala 的文档:
def span(p: (A) => Boolean): (Seq[A], Seq[A])
Run Code Online (Sandbox Code Playgroud)
根据谓词将此可迭代集合拆分为前缀/后缀对。
注意:c span p 等价于(但可能比)(c takeWhile p, c dropWhile p)等价,前提是谓词 p 的计算不会引起任何副作用。
注意:对于不同的运行可能会返回不同的结果,除非对基础集合类型进行了排序。
在查看Seq的F# 文档时,我没有看到任何等效内容。
groupBy、partition、splitAt,它们都不符合我想要做的。这就像同时执行 takeWhile 和 skipWhile,但不需要两次迭代,您只需要一个函数将返回 (takeWhile, skipWhile) 元组的迭代。
输出应与以下函数匹配
module List
let span (predicate: 'a -> bool) (list: 'a list): ('a list * 'a list) =
(list |> List.takeWhile predicate, list |> List.skipWhile predicate)
Run Code Online (Sandbox Code Playgroud)
但只需要一次迭代,因为我的序列可能是无限的。
[1;2;3;4] |> List.span (fun …Run Code Online (Sandbox Code Playgroud) 这是我对这个问题的失败尝试,任何帮助将不胜感激.
我试图找到最好的算法,用于在热切列表上工作的电源组.这部分似乎工作正常.我遇到问题的部分是将它转换为与Sequences一起使用,以便它可以在流\无限列表上运行它.我真的不喜欢yield语法,因为我不太了解它但我宁愿不使用yield语法.
//All Combinations of items in a list
//i.e. the Powerset given each item is unique
//Note: lists are eager so can't be used for infinite
let listCombinations xs =
List.fold (fun acc x ->
List.collect (fun ys -> ys::[x::ys]) acc) [[]] xs
//This works fine (Still interested if it could be faster)
listCombinations [1;2;3;4;5] |> Seq.iter (fun x -> printfn "%A" x)
//All Combinations of items in a sequence
//i.e. the Powerset given each item is unique
//Note: …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些Haskell代码转换为F#,但我遇到了一些麻烦,因为Haskell默认是懒惰而F#不是.我还在学习F#的方式.下面是Haskell中的多态余弦函数,具有相当好的性能.我想尝试在F#中保持相同或更好的性能参数.我希望看到一个F#List版本和一个F#Seq版本,因为Seq版本更像是懒惰的Haskell,但List版本可能会表现得更好.谢谢你的帮助.
效率:使用的算术运算数与串联项数成比例
空间:使用恒定空间,与术语数量无关
takeThemTwoByTwo xs =
takeWhile (not . null) [take 2 ys | ys <- iterate (drop 2) xs]
products xss = [product xs | xs <- xss]
pairDifferences xs =
[foldr (-) 0 adjacentPair | adjacentPair <- takeThemTwoByTwo xs]
harmonics x = [x/(fromIntegral k) | k <- [1 ..]]
cosineTerms = scanl (*) 1 . products . takeThemTwoByTwo . harmonics
cosine = foldl (+) 0 . pairDifferences .
take numberOfTerms . cosineTerms
Run Code Online (Sandbox Code Playgroud) 使用下面的代码,我试图让 BindConverter 的覆盖正确,以允许转换到接口 T
class DynamicProxy<T> : DynamicObject
{
private T t;
public DynamicProxy(T t)
{
this.t = t;
}
public override DynamicMetaObject GetMetaObject(Expression parameter)
{
return new DynamicProxyMetaObject(parameter, this);
}
class DynamicProxyMetaObject : DynamicMetaObject
{
public DynamicProxyMetaObject(Expression expression, DynamicObject value)
: base(expression, BindingRestrictions.Empty, (object)value)
{
}
public override DynamicMetaObject BindConvert(ConvertBinder binder)
{
return base.BindConvert(binder);
}
}
}
Run Code Online (Sandbox Code Playgroud) 错误说
我在C:\ Users \\ AppData\Local\assembly\dl3\4WT9GZ6E.WD1\0CNLWRJ6.ODR\3f01d2db\26ba7213_ebf0cb01中缺少ActiproSoftware.CSharpHostLanguage.xml,并在打开.tt或.ttinclude文件时崩溃.
我有visual studio 2010 sp1和windows 7 sp1 x86(32bit).
有形T4编辑器是v1.950.
欢迎任何建议.谢谢.
更新:最新版本1.962修复此问题.
t4 visual-studio-2010 windows-7 visual-studio-2010-sp1 tangible-t4-editor