小编Guy*_*der的帖子

在F#中查找列表最大值的索引

我正在尝试编写一个以列表为例的函数

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).我对命令式方法非常有信心,但我很难理解如何在功能上做到这一点

f# max

3
推荐指数
1
解决办法
2514
查看次数

什么推理导致`包含递归定义的序列表达式被错误地编译

问题Stack尽管尾部调用位置溢出但仅在64位导致发现F#编译器中的错误.

在阅读答案后,我很好奇导致找到错误的原因,因为我希望更好地提高我解决问题和理解TCO的技能.

f# tail-recursion tail-call-optimization

3
推荐指数
1
解决办法
56
查看次数

这个F#运算符<*>的典型定义/含义是什么?

作为函数式编程的新手,我仍然不熟悉所有标准运算符.事实上,他们的定义在许多语言中都是任意的,并且这些定义在附近的源代码中是不可用的,如果有的话,使得阅读功能代码不必要地具有挑战性.

目前,我不知道WebSharper.UI.Next文档中<*>出现了什么.

如果有一个地方列出了各种功能语言的各种运营商的所有传统定义,那将是一件好事.

f# operators functor applicative

3
推荐指数
1
解决办法
83
查看次数

错误FS0037有时候,非常混乱

如果我编写以下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)

它不会产生任何错误.

我不明白其中的区别.有人可以解释一下吗?

编辑:我在模块级写的第一个代码.

f# functional-programming shadowing

3
推荐指数
2
解决办法
169
查看次数

为什么这不是byref的有效用法?

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# byref

3
推荐指数
1
解决办法
137
查看次数

F#中的区分联合类型检查具有不同的返回类型

我想在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

3
推荐指数
1
解决办法
632
查看次数

使用类型约束的F#模式匹配

是否可以使用成员约束执行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)

没有哪个工作.

f# pattern-matching type-constraints

3
推荐指数
1
解决办法
181
查看次数

过滤事件时,为什么某些GUI控件的类型intellisense/type推断存在差异

我观察到,根据控件的类型,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,访问其页面是有意义的.

.net f# visual-studio winforms

3
推荐指数
1
解决办法
114
查看次数

使用Async.Parallel时,为什么我只有一个线程ID?

使用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)

输出:

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 …
Run Code Online (Sandbox Code Playgroud)

f# multithreading asynchronous

3
推荐指数
1
解决办法
77
查看次数

不为返回列表添加任何值

我在理解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# list

3
推荐指数
1
解决办法
143
查看次数