小编Nul*_*lle的帖子

F#If Statement List.exists

这是一个学校作业,但我即将发布的所有内容都是由我和我完成的.因此,我只需要你的帮助,在我的任务中迈出一小步,我就被卡住了.

let rec removeDuplicates2 xs =
  match xs with
  |[]->[]
  |y::ys -> if y = (List.exists y ys) then
              (removeDuplicates2 ys)
            else
              y::(removeDuplicates2 ys)

printfn "%A" (removeDuplicates2 [3;1;3;2;1]) // result must be [3;1;2] 
Run Code Online (Sandbox Code Playgroud)

我需要帮助的是制作if语句来检查元素y是否是列表ys的成员

目前我得到错误说:"这个表达式预计会有'a - > bool'类型,但这里有'bool'类型"

谁能告诉我我做错了什么?

f# if-statement list exists elements

7
推荐指数
1
解决办法
550
查看次数

F#递归成员函数:"如何正确定义它"

我理解当你在一个类型中定义一个递归成员函数时,就没有必要将函数定义为递归.意思是使用rec关键字.

但是当我这样做时:

type hello() = class
  member this.recursion(x) =
      match x with
      |10 -> printfn "%A" x
      |_ -> printfn "%A" x
            recursion(x+1)
end
Run Code Online (Sandbox Code Playgroud)

然后我得到没有定义递归的错误.

我试过this.recursion但是我仍然得到一个警告说:

递归对象引用'this'未使用.递归对象引用的存在将运行时初始化检查添加到此类和派生类型中的成员.考虑删除此递归对象引用.

所以我想知道在一个类型中定义递归成员函数的正确方法是什么?

recursion f# member-functions

5
推荐指数
1
解决办法
798
查看次数

F#:整数(%)整数 - 计算方法如何?

所以在我的教科书中有一个使用f#的递归函数的例子

let rec gcd = function
| (0,n) -> n
| (m,n) -> gcd(n % m,m);;
Run Code Online (Sandbox Code Playgroud)

使用此功能,我的教科书通过执行以下内容给出了示例

gcd(36,116);;
Run Code Online (Sandbox Code Playgroud)

并且由于m = 36而不是0,那么它的第二个句子是这样的:

gcd(116 % 36,36)
gcd(8,36)
gcd(36 % 8,8)
gcd(4,8)
gcd(8 % 4,4)
gcd(0,4) 
and now hits the first clause stating this entire thing is = 4.
Run Code Online (Sandbox Code Playgroud)

我没有得到的是这个(%)百分号/操作符或此连接中调用的任何内容.对于一个实例我不知道如何

116 % 36 = 8
Run Code Online (Sandbox Code Playgroud)

我现在已经多次转过头了,我无法想象这怎么会变成8?

我知道对于那些知道这一点的人来说这可能是一个愚蠢的问题,但我非常感谢你的帮助.

math recursion f# operators modulus

4
推荐指数
1
解决办法
1362
查看次数

F#了解递归函数

我试图理解为什么递归函数的行为方式.

let rec fact = function 
   |0 -> 1
   |n -> n * fact(n-1);;
Run Code Online (Sandbox Code Playgroud)

当我执行:

fact 4;;
Run Code Online (Sandbox Code Playgroud)

它响应:

val it : int = 24
Run Code Online (Sandbox Code Playgroud)

由于1*2*3*4 = 24,因此是正确的

我没有得到的是这段代码:

|n -> n * fact(n-1);;
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它不计算:

4 -> 4 * (4-1)
4 -> 4 * 3
4 -> 12
Run Code Online (Sandbox Code Playgroud)

我的猜测我是否误解了n的定义

有人能做到这一点并开导我吗?

math recursion f#

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

F#:如何使用Argument Byref Int调用函数

我有这个代码:

let sumfunc(n: int byref) =
  let mutable s = 0 
  while n >= 1 do
    s <- n + (n-1)
    n <- n-1
  printfn "%i" s

sumfunc 6
Run Code Online (Sandbox Code Playgroud)

我收到错误:

(8,10): error FS0001: This expression was expected to have type
    'byref<int>'
but here has type
    'int'
Run Code Online (Sandbox Code Playgroud)

所以我可以告诉我这是什么问题,但我不知道如何解决它.我想我需要指定数字6是byref<int>某种方式.我只是不知道如何.我的主要目标是使n函数或函数参数可变,以便我可以在函数内部更改和使用它的值.

int f# function mutable byref

2
推荐指数
1
解决办法
292
查看次数

F#两种不同类型的函数参数

我试图创建一个函数,将一个字符串和一个整数作为参数/输入.

let rec twoTwo (s : string) (n : int) = 
  match n with 
  |0 -> 0 
  |_ -> s + (twoTwo s (n-1))

printfn "%A" (twoTwo "string" 5)
Run Code Online (Sandbox Code Playgroud)

这里我得到类型int与类型字符串不匹配的错误.这超出了我的原因?它在递归调用中是错误类型错配.

怎么了?

string int f# arguments function

2
推荐指数
1
解决办法
103
查看次数

F#将字符串传递给List

在F#中,您可以通过|>运算符将字符串传递给int,如下所示:

"54" |> int
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法为列表这样做:

"[4;2;3]" |> list
Run Code Online (Sandbox Code Playgroud)

当尝试为列表执行此操作时,错误的是未定义值或构造函数.

也许这根本不可能?

f# operators parameter-passing

2
推荐指数
1
解决办法
620
查看次数

装饰器设计模式:添加功能是什么意思?

我刚刚开始使用 C# 研究装饰器设计模式。

我做了一个例子,除了一件事之外,它的功能与我认为的预期一致。

我有点理解该模式的全部要点是动态地向对象添加功能。

所以当我创建这样的对象时:

Inventory a = new Ashbringer(new TravelersBagpack());
a.Execute();
Run Code Online (Sandbox Code Playgroud)

然后我有点期望重点是该a对象现在能够调用Execute()仅存在于Ashbringer类中的方法。从而向a对象添加功能。

Execute()尽管如此,如果不将方法添加到接口中,我就无法做到这一点,这Inventory最终意味着我必须向所有实现接口或抽象装饰器的Execute()类实现该方法。Inventory

也许我对接口有一两件事不了解,或者也许我误解了装饰器设计模式的要点?

c# design-patterns decorator

2
推荐指数
1
解决办法
711
查看次数

F#递归地理解Fibbonacci序列

这可能听起来像学校的作业,但事实并非如此!

我做了一个递归函数从Fibonacci序列返回一个值.

let rec FoneFive n =
    match n with
    | 1 | 2 -> 1
    | n -> FoneFive(n-1) + FoneFive(n-2)

printfn "%A" (FoneFive 6)
Run Code Online (Sandbox Code Playgroud)

这个递归函数发生了什么?FoneFive 6尽可能给出8.但为什么?

我看待它的方式:从n = 6开始,得出结论6不是1或2.所以它调用FoneFive(n-1) + FoneFive(n-2).(这可能是我错误的地方.但我看到的方式是,除非n为1或2,否则不会返回任何内容.所以从我的观点来看,它会缩小n = 1或2,然后说1 + 1当然是2.)

有人能告诉我它是如何返回8的吗?

math recursion f# fibonacci

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

F#access Array ith元素函数Error

我有几次使用表达式anArray.[i]来访问数组中的元素.

但是当我尝试制作一个非常简单的功能时突然间,我得到了一个错误.

let safeIndexIf anArray i =
  anArray.[i] 
Run Code Online (Sandbox Code Playgroud)

我需要创建一个返回数组的第i个元素的函数,所以我认为这是一个简单但不...

错误:

运算符'expr.[idx]'已基于此程序点之前的信息用于不确定类型的对象.考虑添加其他类型约束

为什么这不起作用?我不知道错误意味着什么.所有我知道我已经做了类似很多次的事情来访问anArray的元素所以为什么我这次不能?

arrays f# element

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