Haskell group在那里描述:http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-List.html#v : group
例如:
group "Mississippi" = ["M","i","ss","i","ss","i","pp","i"]
Run Code Online (Sandbox Code Playgroud)
有简单的F#方式吗?
我可以实现类似的东西
let rec sameCounter (data : list<float>) el same (ss : list<float * int>) =
if data.Length > (el + 1) then
if data.[el] = data.[el + 1] then
sameCounter data (el + 1) <| same + 1 <| ss
else if same > 0 then sameCounter data (el + 1) <| 0 <| (data.[el], same) :: ss
else sameCounter data (el + 1) <| 0 <| ss
else ss
let group d = sameCounter d 0 0 []
Run Code Online (Sandbox Code Playgroud)
但是我认为这有点难看,是否有更好的变体?
这就是我提出的,我认为这是合理的:
let groupConsecutive sq =
(Array.ofSeq sq, [])
||> Array.foldBack (fun x -> function
| [] -> [[x]]
| xs :: xss ->
if x = List.head xs then
(x :: xs) :: xss
else [x] :: xs :: xss)
// val groupConsecutive : s:seq<'a> -> 'a list list when 'a : equality
groupConsecutive "Mississippi"
// val it : char list list = [['M']; ['i']; ['s'; 's']; ['i']; ['s'; 's']; ['i']; ['p'; 'p']; ['i']]
Run Code Online (Sandbox Code Playgroud)
如果你也希望能够获取并返回无限序列,那么你需要手动工作GetEnumerator并且它变得更加丑陋.
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |