一个管道可以一个接一个地输送物品吗?
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]
,然后在单独的行上打印新列表的每个元素,如上所示。
我来自 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]
,然后在单独的行上打印新列表的每个元素,如上所示。