後ろから取ってくるtake

やっぱreverse$take$reverseの方が短いしわかりやすい。
しかし、なんてださいんだ>if
ガードかパターンマッチで書くべきなんだろうが一行でかけない。

Prelude> let takelst n s=if n==0 then [] else (if n==1 then [] else takelst(n-1)$init s)++[last s]
Prelude> let takelst2 n s=reverse$take n$reverse s
Prelude> takelst 4 [1..10]
[7,8,9,10]
Prelude> takelst2 4 [1..10]
[7,8,9,10]

追記:7/2
ガードで一行は f x|x=="foo"="OK"|True="NG"
あと、sが空リストのときの挙動を書いていなかった。

Prelude> let takelst n s|s==[]=[]|n==0=[]|n==1=[last s]|otherwise=(takelst(n-1)$init s)++[last s]
Prelude> takelst 2 [1..12]
[11,12]
Prelude> takelst 0 []
[]