|
|
||
square n = n * n
\num -> num * num
schemeでは
(lambda (num) num * num) 'だっけ?
2引数の場合
\x y -> x + y
\(x,y) -> x + y
ただし、定義できるパターンは1つだけ
(.)::(b -> c) -> (a -> b) -> (a -> c)
1引数のときはこんな感じて定義すればよい?
. f g = \a -> f $ g a
numberOfLinesの例
length::[a] -> Int
なので、
(length . lines) :: String -> Int
(length.lines)のように空白あけなくても大丈夫(少なくともGHCiでは)
(length . lines) "a" ==> 1
length . lines "a" ==> lines "a"が先に結合してしまうためエラー
sortLines = unlines . (sort . lines)
は
sortLines = unlines . sort . lines
としても同じ意味
map (+ 1) -- 部分適用の例
map (+ 1) [1,2,3]
は
(map (+ 1)) [1,2,3]
と部分適用として解釈される
(.)関数と部分適用を使って関数を関数で定義するスタイルのこと
zipLineNumber xs = zip [1..] xs
zipLineNumber = zip [1..]
1,2,3
import Char lstrip ::[Char] -> [Char] lstrip = dropWhile isSpace rstrip ::[Char] -> [Char] rstrip = reverse . lstrip . reverse strip ::[Char] -> [Char] strip = rstrip . lstrip
4
main = do cs <- getContents
putStr $ lastNLines 5 cs
lastNLines n = unlines . takeLast n . lines
takeLast n = reverse . take n . reverse
以下はポイントフリーと呼ぶのか
takeLast = \n -> reverse . take n . reverse
5
import System
import List
main = do cs <- getContents
args <- getArgs
putStr $ fgrep (head args) cs
fgrep :: String -> String -> String
fgrep pattern = unlines . filter match . lines
where
match :: String -> Bool
match = any (isPrefixOf pattern) . tails