-∞から+∞までの整数

[0..]で0〜∞の整数のリストを表せるので、次のようにすると-∞から+∞までの整数を含んだリストができる。

Main> 0:concatMap (\x -> [-x,x]) [1..]
[0,-1,1,-2,2,-3,3,-4,4,-5,5,-6,6,-7,7,-8,8,-9,9,-10,10,-11,11,-12,12,-13,13,-14,14,-15,15,-16,16,-17,17,-18,18,-19,19,-20,20{Interrupted!}

でも組み合わせるとうまくいかない。

Main> map (\x -> f(f(x)) == -x) 0:concatMap (\x -> [-x,x]) [1..]
ERROR - Cannot infer instance
*** Instance   : Num [Complex a]
*** Expression : map (\x -> f (f x) == negate x) 0 : concatMap (\x -> [negate x,x]) (enumFrom 1)

Main> map (\x -> f(f(x)) == -x) concatMap (\x -> [-x,x]) [1..]
ERROR - Type error in application
*** Expression     : map (\x -> f (f x) == negate x) concatMap (\x -> [negate x,x]) (enumFrom 1)
*** Term           : map
*** Type           : (f -> g) -> [f] -> [g]
*** Does not match : a -> b -> c -> d -> e

Main> 

今度のエラーはどういう意味だろう? なんだか根本的なことが分かってない気がする。

mapがわからない

Main> map (\x -> x) [1..2]
[1,2]

Main> map (\x -> x) map (\x -> x) [1..2]
ERROR - Type error in application
*** Expression     : map (\x -> x) map (\x -> x) (enumFromTo 1 2)
*** Term           : map
*** Type           : (f -> g) -> [f] -> [g]
*** Does not match : a -> b -> c -> d -> e

???

わかった

Main> map (\x -> x) (map (\x -> x) [1..2])
[1,2]

優先順位の問題だったようだ。

Main> map (\x -> f(f(x)) == -x) (0:concatMap (\x -> [-x,x]) [1..10])
[True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True]

今度はできた。
次は全てTrueならTrueを返すようにしたい。Maybeを使えばいいのかな?