我正在尝试编写一个以列表为例的函数
let list = [5;23;29;1]
let x = max list // This will return 2 because 29 will be the max value and it's "indexed" at position 2
Run Code Online (Sandbox Code Playgroud)
我不确定如何编写这个max函数
由于我的列表只包含四个元素,我目前有一些这样的代码
let list = (1, newMap1 |> getScore) :: (2, newMap2 |> getScore) :: (3, newMap3 |> getScore) :: (4, newMap4 |> getScore) :: []
Run Code Online (Sandbox Code Playgroud)
我认为这是一个可怕的方法,但我仍然坚持如何(x, _)在找到最大值后返回(_, y).我对命令式方法非常有信心,但我很难理解如何在功能上做到这一点
问题Stack尽管尾部调用位置溢出但仅在64位导致发现F#编译器中的错误.
在阅读答案后,我很好奇导致找到错误的原因,因为我希望更好地提高我解决问题和理解TCO的技能.
作为函数式编程的新手,我仍然不熟悉所有标准运算符.事实上,他们的定义在许多语言中都是任意的,并且这些定义在附近的源代码中是不可用的,如果有的话,使得阅读功能代码不必要地具有挑战性.
目前,我不知道WebSharper.UI.Next文档中<*>出现了什么.
如果有一个地方列出了各种功能语言的各种运营商的所有传统定义,那将是一件好事.
如果我编写以下F#代码,编译器会发出错误.
let a = 123
let a = 123
Run Code Online (Sandbox Code Playgroud)
产生的错误是:
错误FS0037:值'a'的重复定义
如果我在这样的函数中编写相同的代码:
let fctn =
let a =123
let a =123
a
Run Code Online (Sandbox Code Playgroud)
它不会产生任何错误.
我不明白其中的区别.有人可以解释一下吗?
编辑:我在模块级写的第一个代码.
let iter2D (map: 'T byref -> unit) (arr: 'T[][]) =
for y = 0 to arr.Length - 1 do
let row = arr.[y]
for x = 0 to row.Length - 1 do
let mutable elem = arr.[y].[x]
map &elem
Run Code Online (Sandbox Code Playgroud)
最后一行有:"此时不能使用变量'elem'的地址." 怎么了?
我想在F#写一个翻译.我想检查表达式的类型.
这是我对表达式的歧视联盟
type Expr =
| Integer of int
| String of string
| Boolean of bool
Run Code Online (Sandbox Code Playgroud)
这是我用来检查类型的方法
let checkType (e:Expr) =
match e with
| String s -> s
| Integer i -> i
| Boolean b -> b
Run Code Online (Sandbox Code Playgroud)
我希望方法确定表达式是字符串,整数还是布尔值.
但是,visual studio在checkType方法的第4行给出了以下错误:
This expression was expected to have type string but here has type int
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
f# interpreter functional-programming visual-studio discriminated-union
是否可以使用成员约束执行F#类型测试模式?
如:
let f x =
match x with
| :? (^T when ^T : (static member IsInfinity : ^T -> bool)) as z -> Some z
| _ -> None
Run Code Online (Sandbox Code Playgroud)
要么
let g x =
match x with
| (z : ^T when ^T : (static member IsInfinity : ^T -> bool)) -> Some z
| _ -> None
Run Code Online (Sandbox Code Playgroud)
没有哪个工作.
我观察到,根据控件的类型,VS有时会正确识别它所属的类型,但有时候它只会坚持一些EventArgs.
这是一些Winforms/.Net工件吗?
例如,在这种情况下,我在表单上有一些选项卡(f1).x将被正确识别为TabControlEventArgs,我可以插入其中.
f1.tabControl1.Selected
|> Event.filter (fun x -> x.TabPage.Name <> "Tab3")
|> Event.add (fun _ -> f1.comboBox2.Enabled <- false)
Run Code Online (Sandbox Code Playgroud)
但在下面的例子中,x只会显示EventArgs,我必须明确标识属性:
f1.my2CheckBox.CheckedChanged
|> Event.filter (fun x -> not f1.my2CheckBox.Checked)
|> Event.add (fun x -> f1.comboBox2.Enabled <- false)
Run Code Online (Sandbox Code Playgroud)
我认为这是因为某些控件传递的事件信息比其他控件更多.是否存在特定原因,或者这只是一个实现细节,基于某些控件可以执行的操作,因此例如对于tabcontrol,访问其页面是有意义的.
使用Async.Parallel时,为什么我只有一个处理器ID?
码:
open System
open System.Threading
[for i in 1..10 -> async {return i}] |> Async.Parallel
|> Async.RunSynchronously
|> Seq.iter (fun i -> printfn "Processor Id: %d Value: %d" Thread.CurrentThread.ManagedThreadId i)
Run Code Online (Sandbox Code Playgroud)
输出:
Run Code Online (Sandbox Code Playgroud)Processor Id: 1 Value: 1 Processor Id: 1 Value: 2 Processor Id: 1 Value: 3 Processor Id: 1 Value: 4 Processor Id: 1 Value: 5 Processor Id: 1 Value: 6 Processor Id: 1 Value: 7 Processor Id: 1 Value: 8 Processor Id: 1 Value: 9 Processor Id: 1 …
我在理解F#如何工作方面遇到了问题.我来自C#,我认为我正在努力使F#像C#一样工作.我最大的问题是以正确的格式返回值.
示例:假设我有一个带有整数和整数列表的函数.函数应该打印索引列表,其中列表匹配的值传递整数.
我的代码:
let indeks myList n = myList |> List.mapi (fun i x -> if x=n then i else 0);;
indeks [0..4] 3;;
Run Code Online (Sandbox Code Playgroud)
然而它返回:
val it : int list = [0; 0; 0; 3; 0]
Run Code Online (Sandbox Code Playgroud)
而不只是[3],因为我不能在该陈述中忽略其他.我还有 - > int list - > int - > int list的签名,我得到了别的东西.
同样的问题没有.2我想提供一个整数并打印从0到这个整数n次的每个数字(其中n是迭代值):示例:MultiplyValues 3 ;; 输出:[1; 2; 2; 3; 3; 3]
我能做的最好就是创建列表清单.
返回元素时我错过了什么?如何在返回
示例中不添加任何内容:if x = n then n else AddNothingToTheReturn
f# ×10
.net ×1
applicative ×1
asynchronous ×1
byref ×1
functor ×1
interpreter ×1
list ×1
max ×1
operators ×1
shadowing ×1
winforms ×1