むずかしめのパソコン勉強の記録

計算機科学とか関数型言語とか

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とか使うと展開がわからなくなってしまいますね。。難しいです。