Subscribed unsubscribe Subscribe Subscribe

リスト操作

プログラミング Haskell

Common Lispの基本的なリスト操作をHaskellで書いてみた.
まずはCommon Lisp

(defun my-length (x)
  (if (null x)
      0
      (+ 1 (my-length (cdr x)))))

(defun my-append (x y)
  (if (null x)
      y
      (cons (car x) (my-append (cdr x) y))))

(defun my-reverse (x &optional (y nil))
  (if (null x)
      y
      (my-reverse (cdr x) (cons (car x) y))))

続いてHaskell

myLength :: [a] -> Int
myLength [] = 0
myLength (x:xs) = 1 + length xs

myAppend :: [a] -> [a] -> [a]
myAppend [] y = y
myAppend (x:xs) y = (x:myAppend xs y)

myReverse :: [a] -> [a] -> [a]
myReverse [] y = y
myReverse (x:xs) y =  myReverse xs (x:y)

Haskellはパターンマッチングができるので非常に簡潔に書ける.myReverseをCommon Lispの&optionalみたいにして引数1つの関数にするにはどうしたらよいのだろうか.

評価した結果は以下の通り.

(my-length '(1 2 3 4 5)) => 5
(my-append '(1 2 3) '(4 5)) => (1 2 3 4 5)
(my-reverse '(1 2 3 4 5)) => (5 4 3 2 1)
myLength [1,2,3,4,5] => 5
myAppend [1,2,3] [4,5] => [1,2,3,4,5]
myReverse [1,2,3,4,5] [] => [5,4,3,2,1]

やっとなんとなく基本的な使い方がわかってきた気がする.