通过从F#中的另一个选择来创建列表

时间:2014-06-21 16:27:22

标签: f#

我是F#的新手,我一直在为C#开发人员阅读F#的前几章。我被困在这一点上,我需要帮助。如果有人认为我违反本网站的目的,请告诉我,我将删除我的问题。

我有以下列表

let list1 = [0..100]

我想从上面的列表中创建一个列表,但只选择可被5整除的数字。我正在尝试以下操作。

let list2 = [for i in list1 do yield if i%5=0 then i]

但是上面给出的编译错误如下。这是为什么 ?为什么它不能简单地推断int类型?

  

Program.fs(6,52):错误FS0001:此表达式应该具有   类型       单位,但这里有类型       INT

2 个答案:

答案 0 :(得分:4)

您需要移动yield内的if

let list2 = [for i in list1 do if i%5=0 then yield i]

没有if ... then的{​​{1}}表达式只能返回else类型的内容,因为整个表达式必须有一个值,如果条件不满足,则编译器赢了“只需构成任何其他类型的值。

在你的情况下,你试图说如果条件满足,表达式应该产生unit,否则没有;正确的方法是使int有条件。否则你说你总是想要产生一个值,即使条件不满意。

答案 1 :(得分:4)

由于您想要过滤,因此使用内置filter功能更容易:

let list2 = list1 |> List.filter (fun x -> x % 5 = 0)

鉴于你的list1,它会产生输出

  

[0; 5; 10; 15; 20; 25; 30; 35; 40; 45; 50; 55; 60; 65; 70; 75; 80; 85; 90; 95; 100]