結城浩のHaskell日記 RSSフィード

2006-06-21

List Comprehension List Comprehension - 結城浩のHaskell日記 を含むブックマーク

何となくList Comprehension(リストの内包表記)が書きたくなって、ついでにきのうのhiding構文を試してみたくなって。

import Prelude hiding (even)
even = [ x | x <- [0..], x `mod` 2 == 0]

でも、考えてみれば、これでよいんだった。

import Prelude hiding (even)
even = [0,2..]

追記:「-2も偶数」というもっともなコメントをいただきました。

import Prelude hiding (even)
even = 0:f [2,4..]
    where
        f [] = []
        f (x:xs) = x:negate x:f xs

実行結果です。

*Main> take 20 even
[0,2,-2,4,-4,6,-6,8,-8,10,-10,12,-12,14,-14,16,-16,18,-18,20]

追記:さらにコメントをいただきました。符号との組み合わせでList Comprehension。なるほど。

e = 0:[sign*x| x <- [2,4..], sign <- [1,-1]]

ということは、以下でもよいですね。kの倍数。

muls k = 0:[ s * x | x <- [1..], s <- [k,-k] ]

実行結果です。

*Main> take 10 $ muls 2
[0,2,-2,4,-4,6,-6,8,-8,10]
*Main> take 10 $ muls 3
[0,3,-3,6,-6,9,-9,12,-12,15]
*Main> take 10 $ muls 10
[0,10,-10,20,-20,30,-30,40,-40,50]

追記:nobsunからトラックバックが。

evens = tail [ 2*m x | x <- [0..], m <- [id,negate]]

なるほど、[id,negate]をcomprehensiveに動く(って用語は正しいでしょうか)というのは高階っぽくてよいなあ。

なぜtail?と一瞬思ったけれど、0を一個捨てるのですね。なるほど。

ということは、以下でもよいですね。kの倍数。

muls k = tail [ f x | x <- [0..], f <- [(*k),(*negate k)] ]

__2006/06/21 09:18-2 も偶数ですよ

__2006/06/21 15:430:[sign*x| x <- [2,4..], sign <- [1,-1]] という手も

トラックバック - http://haskell.g.hatena.ne.jp/hyuki/20060621