假设我有一个排序列表l,可能有重复值 - 我想返回一个列表,其值为n,但只返回一次. - 例如,对于输入[1,2,3,3,3,4]和3,返回[1,2,3,3,4].我该怎么做?
type Point<'t> =
val X : 't
val Y : 't
new(x : 't,y : 't) = { X = x; Y = y }
let clampedSubtract (p1:Point<_>) (p2:Point<_>) =
Point( max (p2.X - p1.X) 0, max (p2.Y - p1.Y) 0 )
Run Code Online (Sandbox Code Playgroud)
如果你看一下上面的代码,你会注意到,该函数并没有像它应该的那样实现.
首先,使用max表达式中的0将类型钳制为int.但它应该是任何类型的类型Point<'t>,而不是Point<int>.
但更重要的是,如果将签名类型用于`t,则此函数只能按预期工作.
这提出了我的一些问题:
提前致谢.
我尝试使用boost的transitive_reduction,但我不知道如何使用它。
我有一个定义为的图表:
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, IQsNode*> Graph;
typedef Graph::vertex_descriptor Vertex;
Run Code Online (Sandbox Code Playgroud)
我想调用该方法:
Graph TC;
boost::transitive_reduction(_fullGraph, TC,g_to_tr_map_stor,g_to_tc_map_stor);
Run Code Online (Sandbox Code Playgroud)
我不知道“g_to_tr_map_stor”和“g_to_tc_map_stor”必须使用的类型。
根据我读到的信息,它一定是从顶点
到整数的映射。我尝试了很多种地图但没有成功。
一些想法?
谢谢
如果我在C#商店工作并尝试在F#中编写功能然后依靠ILSpy将F#源代码翻译成C#表示,会涉及哪些风险?
通过遵循连续传递样式(CPS),可以使每个递归函数尾递归.据我所知,你把第一次递归调用后的所有内容都放到一个函数中,然后把它交给同一个调用.因此,递归调用是函数中的最后一个语句,编译器能够进行尾调用优化.这意味着递归被循环替换.没有额外的堆栈帧消耗.
延续是一项功能,它可以完成所有剩下的工作.在我看来,每次递归调用(或循环迭代),延续都在增长.我想知道在执行循环时这个不断增长的指令集存储在内存中的哪个位置.据我所知,只存在两个可以保存动态数据的内存部分:堆栈和堆.我会排除堆栈,因为堆栈帧大小在已经分配时是固定的.它不能保持延续的增长指令集,因此堆剩余.也许堆栈帧包含指向存储连续函数的存储器地址的指针.这个假设是否正确?
这里有一个简单的例子.这是一个递归函数,它不是尾递归的:
// bigList: int -> int list
let rec bigList = function
| 0 -> []
| n -> 1 :: bigList (n-1)
Run Code Online (Sandbox Code Playgroud)
当参数n很小时,一切都可以:
> bigList 3;;
val it : int list = [1; 1; 1]
Run Code Online (Sandbox Code Playgroud)
但是当n很好时你可以得到一个stackoverflow错误:
> bigList 170000;;
Stack overflow in unmanaged: IP: 0x2dcdb0, fault addr: 0xbf759ffc
Stack overflow in unmanaged: IP: 0x2dcdb0, fault addr: 0xbf758ffc
...
Run Code Online (Sandbox Code Playgroud)
这基本上是相同的功能,但在延续传递方式:
// bigListC: int -> (int list -> 'a) -> 'a
let rec bigListC n c = …Run Code Online (Sandbox Code Playgroud) 在F#中,我可以这样解析一个浮点数:
let tryParseFloat s =
let ok,f = System.Double.TryParse s
if ok then f else nan
Run Code Online (Sandbox Code Playgroud)
然后
let parsed = tryParse "123.123"
match parsed with
| nan -> ignore parsed
| _ -> dostuff parsed
Run Code Online (Sandbox Code Playgroud)
如何使用int实现类似的功能?
这是我第一次遇到阴影,似乎没有特定于我的问题的资源.
如果我做以下事情
let x = a list
let x = another list
Run Code Online (Sandbox Code Playgroud)
然后x将保存第二个列表的内容.
我假设(基于我的导师所说的)第一个列表不会自动销毁,只是在范围的末尾收集垃圾.
我的问题是为什么?一旦不可变被遮蔽,为什么我们不会自动删除第一个列表?这会让我认为数据仍然可以以某种方式被访问.如果是这样,怎么样?
我只是从F#开始,所以我想我会尝试一些简单的任务.
这将列出目录中xml文件的完整路径:
System.IO.Directory.GetFiles("c:\\tmp", "*.xml")
|> Array.iter (printfn "%s")
Run Code Online (Sandbox Code Playgroud)
但我只想要文件名,所以我试过:
System.IO.Directory.GetFiles("c:\\tmp", "*.xml")
|> Array.iter (System.IO.Path.GetFileName)
|> (printfn "%s")
Run Code Online (Sandbox Code Playgroud)
这不会编译.它给出了错误:
该表达式应该具有类型单元,
但这里有类型字符串
我搜索了一些例子但找不到任何东西.我显然缺少一些简单而基本的东西,但是什么呢?
我正在尝试使用NUnit为F#项目设置测试套件。似乎特别是在测试诸如解析器和类型检查器之类的东西时,通常具有一列有效输入数据和一列无效数据。测试本身实际上是相同的,因此我正在寻找一种聪明的方法来避免为每个数据项编写测试函数,而是将测试函数与数据分开。显然,这似乎有一个所谓的测试用例,但是我很难找到有关将NUnit 3与F#一起使用的全面文档,尤其是针对我的场景的最佳实践示例。
非常感谢任何指针和提示!
首先,我想说,我对这种语言完全不熟悉,而且现在对我来说似乎非常奇怪(作为Java/C#用户).
我正在做一个uni项目,我必须使用寻路来导航网格(甚至不接近这一点,稍后会处理它),我创建了一个大小为10x10的二维数组但是我已经发现我可以通过使用像mutable position = 0,0这样的东西存储我当前的位置,这给了我一种int*int.
这对我来说似乎很棒,因为我可以轻松地存储我的X和Y位置,但是我遇到了一些问题
1)获取变量中的各个值.IE获取我当前的X位置或获得我当前的Y位置
2)添加到此变量,以便我可以在网格中移动.IE位置< - 位置+(5,5)
再一次,我对这种语言只有少量的经验,所以请保持温和,尽管我似乎很好地掌握了基础知识.
感谢您提供的任何帮助!