一个管道可以一个接一个地输送物品吗?

Can one pipe items one-after-another?

我来自 PowerShell,我的想法是一个接一个地通过管道传输列表中的项目。

PS> @(1,2,3,4) | ForEach-Object { Write-Output -InputObject $_ }

这是我对直接翻译的幼稚尝试,但它将整个列表作为一个对象进行管道传输。

> [4;5;6] |> printfn "%A";;
[4; 5; 6]
val it : unit = ()

我相信下面是我最接近的尝试:

[4;5;6] |> List.map int x |> printfn "%i" x ;;

它抛出错误:

[4;5;6] |> List.map int x |> printfn "%i" x ;;
  -----------^^^^^^^^^^^^^^

stdin(31,12): error FS0001: This expression was expected to have type
    'int list -> 'a'    
but here has type
    ''b list'

如何从列表中正确地管理项目?

如果您想在单独的行上打印列表的每个元素,可以这样做:

[4;5;6] |> List.iter (printfn "%i")

List.iter 用于对列表的每个元素执行操作。在这种情况下,操作是 printfn %i。您可能会发现这有点令人困惑,因为元素本身从未绑定到名称。这称为“point-free”编程风格。在这种情况下,您可以使用 lambda,如下所示:

[4;5;6] |> List.iter (fun x -> printfn "%i" x)

另一方面,List.map 用于通过对现有列表的每个元素应用函数来构造新列表。所以你可以这样做:

[4;5;6]
    |> List.map ((*) 2)   // [8;10;12]
    |> List.iter (printfn "%i")

通过将原始列表的每个元素乘以 2,从 [4;5;6] 构造列表 [8;10;12],然后在单独的行上打印新列表的每个元素,如上所示。