Haskell Platform 2012.2.0.0 をインストール

こういう書き方も出来るんだ。case や let 〜 in ではよくやるけど、where でも出来るんだ。左辺は関数名と引数、右辺は式だとばかり思っていた。例示したコードは適当。

foo xs = h * (-1): ts
  where (h:ts) = xs   -- ここ

where でも出来るのならと思って Top-level で試したら、こちらも同様だった。使い道は? と尋ねられても困るけど。

(x:xs) = [1, 2, 3, 4]
-- x  -> 1
-- xs -> [2, 3, 4]

09:29:58 masayasu@alex:~% vim aaa.txt && cat aaa.txt | ./conv.php > hoge.md && cat hoge.md 冷やし中華始めました、みたいな感じで。

すごいHaskellたのしく学ぼう! を読んでいる。Haskell の全くの初心者ではないので、はじめの方はそれほど知らないことはないだろうと思っていたけど、そうでもなかった。まだまだ勉強不足ですな。

知らなかったところをメモしておく。

関数のリスト

P.72 の 「map 関数に複数の引数を与える」に書かれている内容で以下のコードがあった。

Prelude> let listOfFuns = map (*) [0..]
Prelude> (listOfFuns !! 4) 5
20

おおっと思った。listOfFuns は 関数のリストだ。今までリストの要素は値(数や文字など)が入るとばかり思っていた。Haskell では関数も第一級のオブジェクトだということを再認識した。

念のため listOfFuns の型を確かめると

Prelude> :t listOfFuns
listOfFuns :: [Integer -> Integer]

確かに関数のリストだ。 09:33:43 masayasu@alex:~% vim aaa.txt && cat aaa.txt | ./conv.php > hoge.md && cat hoge.md Haskell Platform 2012.2.0.0 をインストールしました。

問題

インストール終了後、ghci を実行すると以下のように出力されました。

% ghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.

<no location info>:
    Warning: -O conflicts with --interactive; -O ignored.
Prelude>

Warning が出ています。どうも -O オプションが影響しているっぽいので、~/.ghci を見直しました。見直した後の ~/.ghci はこちら。

:set -Wall
:set -fno-warn-type-defaults
:def hoogle \x -> return $ ":!hoogle \"" ++ x ++ "\""

":set -O" を削除しました。これで ghci を実行すると Warning は出力されなくなりました。

% ghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude>

おまけ

Warning: -O conflicts with --interactive; -O ignored.

--interactive と衝突したから -O は無視しました、という意味です。 でも --interactive なんてオプションは設定していません。 どうしてだろうと思って ghci の中身をのぞいてみると --interactive が指定されていることがわかりました。というか、ghci って ghc --interactive のショートカットだったんだですね。前のバージョンもそうだったんでしょうか?

% cat `which ghci`
#!/bin/sh
exec "/Library/Frameworks/GHC.framework/Versions/7.4.1-x86_64/usr/bin/ghc-7.4.1" --interactive ${1+"$@"}