Haskell H99 Question 17
H99のQuestion 17
http://www.haskell.org/haskellwiki/99_questions/11_to_20
全然わからなかったので答え見ました。
模範解答
http://www.haskell.org/haskellwiki/99_questions/Solutions/17
split :: [a] -> Int -> ([a], [a]) split [] _ = ([], []) split l@(x : xs) n | n > 0 = (x : ys, zs) | otherwise = ([], l) where (ys,zs) = split xs (n - 1)
例によって実際にやってみます。
split “abcde” 3
とすると、
1. split “abcde” 3 ==> n > 0 なので、 ( ‘a’ : ys, zs) where (ys, zs) = split “bcde” 2 2. split “bcde” 2 ==> n > 0 なので、 ( ‘b’ : ys, zs) where (ys, zs) = split “cde” 1 3. split “cde” 1 ==> n > 0 なので、 ( ‘c’ : ys, zs) where (ys, zs) = split “de” 0 4. split “de” 0 ==> otherwiseなので、 ([], “de”) 5. 3に戻って ( ‘c’ : ys, zs) where (ys, zs) = ([], “de”) ==> ( ‘c’ : [], “de”) 6. 2 に戻って ( ‘b’ : ys, zs) where (ys, zs) = ( “c”, “de”) ==> ( ‘b’ : “c” , “de”) 7. 1に戻って ( ‘a’ : ys, zs) where (ys, zs) = ( “bc”, “de”) ==> ( ‘a’ : “bc”, “de”) ==> ( “abc”, “de”)
うん、できてる。
whereとか、let…inとか使うと展開がわからなくなってしまいますね。。難しいです。