【发布时间】:2012-09-28 19:21:52
【问题描述】:
我想实现一个具有以下特点的函数:
- 将一个
array(Array[A]) 和多个pieces作为参数返回(Int) - 返回分割成
pieces块的array数组。 - 如果可能,所有片段的长度应该相等,否则第一个片段应该比最后一个片段长一个元素(如果
array的长度不是pieces的倍数)
在 Haskell 中,我会按照这些思路编写一些代码:
split :: [a] -> Int -> [[a]]
split list pieces = go list (length list `div` pieces)
where
go xs n | l > n && m == 0 = take n xs : go (drop n xs) n
| l > n = take (n + 1) xs : go (drop (n + 1) xs) n
| otherwise = [xs]
where
l = length xs
m = l `mod` n
虽然在 Scala 中,我在编写这个(基本)函数时遇到了很多困难。对于递归,Array 似乎不太适应。然后,if 结构允许我实现我在 haskell 中使用的那种守卫,不允许代替表达式,这对我来说似乎很奇怪。我遇到的另一个问题是我不知道如何使我的 scala 代码多态(就像我的 Haskell 代码一样)。最后但并非最不重要的一点是,我不明白如何不仅制作 a 等价多态,还制作 Array 实例,因为 Scala 中有许多基本集合。
我会接受完整的解释解决方案或简单的提示来回答我的误解。
【问题讨论】:
-
其实不是。
.grouped(pieces)将根据需要返回尽可能多的pieces长的片段。我希望这个函数返回pieces件。 -
它比你想象的更接近。如果有
transpose-alike,那么您可以转置.grouped(pieces)... 的结果,尽管这不会保留元素的顺序,如果这很重要的话。 -
将haskell程序改写成scala是不是一个有趣的课程?
-
progfun?那是什么? :p 我只是想在大型项目之前了解大学的 Scala :)