F#:将数字数组作为字符串缩减为单个整数
我有一个字符串数组,称之为F#:将数字数组作为字符串缩减为单个整数,f#,F#,我有一个字符串数组,称之为a,其中每个字符串代表一个数字。我还有一个函数f:int->int->int,我想用它“将a减少为一个数字”。我想写: a |> Array.reduce (fun x y -> f (int32 x) (int32 y)) 但这不起作用,因为“reduce”类型禁止我从f返回整数(因为a是字符串数组) 有没有一种功能性的方法可以在不返回 是从f转换字符串,还是先将字符串数组转换为int数组 使用数组。首先减少映射 如果你不想调整你的f来处理字符串,你想使
a
,其中每个字符串代表一个数字。我还有一个函数f:int->int->int
,我想用它“将a
减少为一个数字”。我想写:
a |> Array.reduce (fun x y -> f (int32 x) (int32 y))
但这不起作用,因为“reduce”类型禁止我从f
返回整数(因为a
是字符串数组)
有没有一种功能性的方法可以在不返回
是从f
转换字符串,还是先将字符串数组转换为int数组
使用数组。首先减少映射
如果你不想调整你的f
来处理字符串,你想使用Array.reduce
,那么是的,我想你应该首先进行转换(老实说,这似乎比用包装器lambda手动完成要容易),那么为什么不直接使用它呢
a
|> Array.map int32
|> Array.reduce f
相反
如果您关心生成中间数组的开销,您可以随时使用Seq.
惰性地切换到数组。
:
a |> Seq.map int32 |> Seq.reduce f
使用数组。折叠
除此之外,您还可以根据自己的心愿折叠:
a |> Array.fold (fun n s -> n + int32 s) 0
因此,您可以称之为更实用的;) 使用数组。首先减少映射
如果你不想调整你的f
来处理字符串,你想使用Array.reduce
,那么是的,我想你应该首先进行转换(老实说,这似乎比用包装器lambda手动完成要容易),那么为什么不直接使用它呢
a
|> Array.map int32
|> Array.reduce f
相反
如果您关心生成中间数组的开销,您可以随时使用Seq.
惰性地切换到数组。
:
a |> Seq.map int32 |> Seq.reduce f
使用数组。折叠
除此之外,您还可以根据自己的心愿折叠:
a |> Array.fold (fun n s -> n + int32 s) 0
因此,您可以称之为更实用的;) 是的,我不想首先转换整个数组。我不知道“折叠”法能做到这一点。谢谢你指出这一点。fold
可以做任何事情(这是列表上的基本操作,因为它隐藏了列表定义)@Carsten你能详细解释一下“因为它隐藏了列表定义”是什么意思吗?@sebhofer这是lambda演算中通常使用的和-但这只是一个简单观察的聪明说法,折叠折叠f i ls
(好的,实际上它是列表。折叠
)保留列表的结构ls=1::2::3::[]
不变,只是替换[]
带i
和:
带f
(作为一个箱子操作员):折叠(+)0 ls=1+(2+(3+0))
谢谢Carsten!我需要一点时间来消化(我对函数式编程还不熟悉)…是的,我不想首先转换整个数组。我不知道“折叠”法能做到这一点。谢谢你指出这一点。fold
可以做任何事情(这是列表上的基本操作,因为它隐藏了列表定义)@Carsten你能详细解释一下“因为它隐藏了列表定义”是什么意思吗?@sebhofer这是lambda演算中通常使用的和-但这只是一个简单观察的聪明说法,折叠折叠f i ls
(好的,实际上它是列表。折叠
)保留列表的结构ls=1::2::3::[]
不变,只是替换[]
带i
和:
带f
(作为一个箱子操作员):折叠(+)0 ls=1+(2+(3+0))
谢谢Carsten!我需要一点时间来消化这一点(我是函数式编程新手)。。。