我是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
答案 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]