F#实现数组/列表逐元素加固定值时Seq.map无预期结果怎么办
问题根因
你的代码不存在语法或逻辑错误,看不到预期结果的核心原因有两点:
Seq.map的返回值是惰性求值的seq<int>(对应.NET的IEnumerable<int>),这类序列不会在映射调用时立刻执行计算,只有当代码主动遍历、访问序列元素时,才会真正执行每个元素加4的逻辑。F#交互窗口默认不会主动枚举惰性序列的内部元素,只会打印值的类型签名,因此你只看到val result: seq<int>,看不到具体元素值。- 你仅将映射结果绑定为seq类型值,没有触发求值或转换为会立即打印内容的具体集合类型。
修正方案
选择以下任意一种写法,都能得到预期的[5;6;7]结果:
- 直接使用列表专用的映射函数
List.map,返回立即求值的int list类型,F#交互窗口会直接打印列表内容:
let sumUp int1 int2 = int1 + int2 let numbers = [1;2;3] let result = numbers |> List.map (sumUp 4)
运行后FSI会输出:val result : int list = [5; 6; 7]
- 保留
Seq.map写法,在后续将seq转换为列表触发求值即可:
let result = numbers |> Seq.map (sumUp 4) |> Seq.toList
额外说明:你对
sumUp的柯里化写法sumUp 4是完全正确的,这个写法确实生成了一个“接收单个整数、返回该整数加4结果”的函数,完全匹配Seq.map要求的映射函数签名,这部分代码没有问题。
内容的提问来源于stack exchange,提问作者Jordy Huijgens
相关产品推荐
相关产品推荐

