我正在试图找出为什么我会得到下面的错误,而不是我对我的方法的正确实现感兴趣。
我有以下f#代码,用于将元组列表分解为包含元组中所有项的列表,如下所示:
let unpair l =
let rec loop acc l =
match l with
| [] -> acc
| (x,y)::tl ->
loop (acc @ x @ y) tl
loop [] l
//should print:
// [1 2 3 4 5 6]
printf "["
List.iter (p
我正在用F#进行编程,并试图使用Set.fold将一个集合列成一个列表。
我到目前为止所做的事:
let list sa = Set.fold (fun se sa -> sa) [];;
但它似乎并没有将集合变成列表,而是将一组列表放入列表中。
我可以对我的代码做什么修改,这样它就不会把一组列表变成列表,而是把一组列表变成列表。
我正在检查F#列表和数组的性能。鉴于这一守则:
let list = [ 1.. 100000 ]
for i in 1 .. 100 do ignore ( list|>List.map(fun n -> n))
let array = [| 1.. 100000 |]
for i in 1 .. 100 do ignore ( array|>Array.map(fun n -> n))
我怀疑这两人都是在非常相似的时间里跑步的。实际上,数组的速度要快10倍:数组需要28 ms,list需要346 ms!为什么会这样呢?我理解F#中list的概念,例如,在list或
我已经编写了这段F#代码来统计列表中的单词频率,并向C#返回一个元组。你能告诉我怎样才能使代码更有效或更短吗?
let rec internal countword2 (tail : string list) wrd ((last : string list), count) =
match tail with
| [] -> last, wrd, count
| h::t -> countword2 t wrd (if h = wrd then last, count+1 else last @ [h], count)
let internal countword1 (str
首先,我知道如何在f#中追加列表。如果我有list = [1;2;3],那么我可以做一些类似5 :: list的事情,它会给我一个新的列表[5;1;2;3]。
然而,我已经编写了一个函数,它使用完全相同的语法,但却将其追加到列表的后面,我无法在我的一生中找到原因。有人能给我解释一下为什么我写的函数在我的列表后面而不是前面附加和项目吗?
let menu = [("pizza",17);("hotdog",5);("burger", 12);("drink",3);("milkshake",4)]
let rec
我不能让它在F#中工作。我正在尝试编写一种向量加法的尾递归形式,并使用a传递先前计算的值。它给出了错误“FS0001:类型不匹配”。期望“a”。
但给‘b列表-> 'c列表-> 'a list’
类型'a‘和’b list -> 'c list ->‘a list’不能统一。“
let rec vecadd a v1 v2 =
match (v1, v2) with
| ([], []) -> a
| (h1::t1, h2::t2) -> vecadd a::h1+h2 t1 t2
我开始从零开始学习f#,我发现自己对数组和列表之间的区别非常困惑,我知道列表是不可变的,但仍然是不变的。
我试图创建一个函数,如果一个元素不存在,它会添加到一个列表中,然后返回新的列表,否则返回当前的列表。
以下是我到目前为止所拥有的:
let elem x= Array.exists ((=) x)
let elemOrAdd e l = if elem e l then l else e::l
E::我不工作,视觉工作室抛出
This expression was expected to have type
'a []
but here has type
&
我想在F#中使用一个新的内置函数(F#)。我有一个包含数字的列表,我必须返回它的最大值。如果列表为空,则应该为0。我试着用这样的方式解决它:
let max a b : Nat = if a > b then a else b
let maxofList = List.fold max
let maximum (xs: Nat list): Nat = maxofList xs
我无法编译它,我也不知道如何用另一种方式来解决它,也许我只是不知道内置函数是如何工作的。输入如下所示:
maximum [12N; 4N; 67N; 5N] = 67N
我试图在F#中使用伪C#代码执行以下操作:
Data? MyFunc(a, b, c) { ... }
var result = new List<Data>();
foreach (var i in MyData)
{
var r = MyFunc(something, somethingelse, i);
if (r != null) result.add((Data)r);
}
我有两个问题:
是否有类似的List.filter允许检查函数调用的结果是否为空?
如果某些参数不是来自列表迭代器,我如何通过列表调用函数?就像在我的例子里一样的东西
有没有其他方法可以在不使用array.rev函数和不复制原始数组的情况下在F#中反转数组,可能类似于您反转列表的方法。 let rev (lst : List<'T>) =
let length = List.length lst
seq { for i in (length-1) .. -1 .. 0 do yield lst.[i] }
|> Seq.toList
我正在尝试创建一个管道,它的主要参数是一个带有常量的列表。
举个简单的例子
type ClockType = | In | Out
let ClockMap index offset =
match index with
| index when index + offset % 2 = 0 -> In
| _ -> Out
let MapIt offset = [0 .. 23] |> List.map offset
当我拿出offset的时候它就能工作了。我试过做一个tuple,但它不喜欢int list。做这件事最好的方法是什么?
我只是在学
我正在编写一个函数,它接受两个列表,需要创建一个新的列表,如下所示:
(a b) (c d e f) --> ((a b c) (a b d) (a b e) (a b f))
即,将第二列表的每个元素作为元素添加到第一列表,第二列表的每个元素一个元素。
我想不出该怎么做。我尝试过以下几个版本:
(map list (list1) (list2))
但没有成功。
任何建议都是值得感谢的。
受的启发,我想尝试使用F#开发最新的
我的方法可能完全偏离了路线,但在解决这个问题的过程中,我试图获得数字0-9的所有排列的列表。
我正在考虑使用n元树来解决这个问题,如下所示:
type Node =
| Branch of (int * Node list)
| Leaf of int
我对自己很满意,因为我已经找到了如何生成我想要的树。
我现在的问题是,我不知道如何遍历这棵树,并将每个叶子的“路径”提取为一个int。让我感到困惑的是,我需要在单个节点上进行匹配,但我的“外部”函数需要获取一个节点列表。
我现在的尝试几乎是正确的,只是它返回了所有路径的总和……
let t
我测试了两种不同的方法来反转python中的列表。
import timeit
value = [i for i in range(100)]
def rev1():
v = []
for i in value:
v.append(i)
v.reverse()
def rev2():
v = []
for i in value:
v.insert(0, i)
print timeit.timeit(rev1)
print timeit.timeit(rev2)
有趣的是,将值插入第一个元素的第二个方法比第一个方法慢得
f#中是否有一个具有“追加”方法的集合类型,以便我可以将一个元素添加到该集合中:
(伪码)
let list = [1,2,3,4]
list.append( 5 )
print list
结果: 1,2,3,4,5
基本上,我需要一个可以在运行时增长的集合,我不能假设它的大小。在f#中,我找不到一种用列表或数组来完成这个任务的方法
更新:我不想每次都要创建一个新的列表/数组。我想附加已经存在的集合。我需要对集合使用相同的名称/符号。F#不允许我重新声明或重写一个集合,所以这是行不通的:
let A = [1,2,3]
let A = A.append 4 or A <- Array.
我对C#有丰富的经验,但对F#和函数式编程还很陌生。现在,我试图在F#中实现一个类库。下面是一个函数:它接受整数列表<=9并将连续的9,9,9更改为9,9,9,9到9,10,11,12。例如,9;9;9;1;4;4;0;1;9;9;9;9;9将更改为9;10;11;1;4;0;1;9;10;11;11;12。
C#函数是微不足道的:
void ReleaseCap(List<int> items)
{
for (int i = 1; i < items.Count; i++)
{
var current = items[i];