在F#中寻找Haskell`group`替代品

cnd*_*cnd 3 f#

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)

但是我认为这有点难看,是否有更好的变体?

Tar*_*mil 7

这就是我提出的,我认为这是合理的:

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并且它变得更加丑陋.