List.hsとPrelude.hsを探したけど、無かった。 無いとは言いきれないけどね。 いちおうお求めの関数は f :: Int -> [a] -> [[a]] f num lst | length lst >= num = take num lst : f num (tail lst) | otherwise = [] でいいとは思います。
37 名前:デフォルトの名無しさん mailto:sage [04/02/19 14:41]
あ、インデントが。 f num lst以下の2文はインデントを深くしないと、だめです。 いちおう念のため。
38 名前:デフォルトの名無しさん mailto:sage [04/02/19 14:57]
myTakeを定義しておいて、(長さが足りないとNothing)
g :: Int -> [a] -> [[a]] g num lst = mapMaybe (myTake num) (tails lst)
これだとlst >> numでもOK
39 名前:デフォルトの名無しさん mailto:sage [04/02/19 15:01]
myTake :: Int -> [a] -> Maybe [a] myTake n _ | n < 0 = Nothing myTake n _ | n == 0 = Just [] myTake n (x:xs) = case myTake (n-1) xs of Just xxs -> Just (x:xxs) Nothing -> Nothing myTake _ [] = Nothing
40 名前:デフォルトの名無しさん mailto:sage [04/02/19 15:37]
takeMaybe :: Int -> [a] -> Maybe [a] takeMaybe n [] | n == 0 = Just [] | otherwise = Nothing takeMaybe n (x:xs) | n < 0 = Nothing | n == 0 = Just [] | otherwise = takeMaybe (n-1) xs >>= \r -> Just (x:r)
import List h num lst = [ take num x | x <- tails lst, length x >= num ]
i num = map (take num) . filter ((>=num) . length) . tails
43 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:03]
だんだんエレガントにしようとするところが関数型言語スレらしいな。 ############################# import Data.Maybe -- 再帰で書いてみた f n xs = catMaybes $ f' n xs where f' n [] = [] f' n xxs@(x:xs) = (takeJust n xxs):f' n xs
-- AKA myTake and takeMaybe takeJust 0 xs = Just [] takeJust n [] = Nothing takeJust n (x:xs) = takeJust (n - 1) xs >>= \xs -> Just (x:xs)