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

2006-06-13

エラトステネスの篩 エラトステネスの篩 - 結城浩のHaskell日記 を含むブックマーク

何となくエラトステネスの篩。

primes = sieve [2..]
    where
        sieve (n:ns) = (:) n $ sieve $ filter (`cannotDivBy` n) ns
        n `cannotDivBy` k = n `mod` k /= 0

実行結果です。

*Main> take 10 primes
[2,3,5,7,11,13,17,19,23,29]
*Main> primes !! 1000
7927

追記:nobsunの「双子素数」のリスト内包表記がかっこいーなー。

primes = sieve [2..]
sieve (p:ps) = p:sieve [p'| p'<-ps, p' `mod` p /= 0]
s f g x = f x (g x)
twins = filter ((2==) . uncurry subtract) $ s zip tail primes
  • s f g x = f x (g x) の部分は、一つの引数xを複数箇所で使い回す高階関数を作っちゃうところがおもしろい。「○○をしたい」→「それをする高階関数は?」
  • filterに渡している部分適用((2==) . uncurry subtract)もおもしろい。
    • まず、Num => a -> a -> aであるsubtractをuncurryで(a,a)->aにしちゃう。これはzipの出力をsubtractで受け止めるため。
    • そしてその結果が2になるかどうかを調べる。ふうん。

カリー化 カリー化 - 結城浩のHaskell日記 を含むブックマーク

distance (a, b) = abs $ subtract a b
cdist a b = distance (a, b)
cdist'    = curry distance

実行結果です。

*Main> distance (10, 3)
7
*Main> distance (3, 10)
7
*Main> cdist 10 3
7
*Main> cdist 3 10
7
*Main> cdist' 3 10
7
*Main> cdist' 10 3
7
*Main> map (cdist' 5) [0..10]
[5,4,3,2,1,0,1,2,3,4,5]

Windows XPでHaskellコンパイラ(GHC)をインストールする手順 Windows XPでHaskellコンパイラ(GHC)をインストールする手順 - 結城浩のHaskell日記 を含むブックマーク

Windows XPで、

をインストールする手順を以下に示します。

  • (1) http://www.haskell.org/ghc/download.html へ行く。
  • (2) Current Stable Releaseの下にある番号(たとえば6.4.2)のリンクをたどる。
  • (3) Binary Packagesの中からWindows 95/98/ME/2000/XP (x86) (standalone)を選ぶ。
    • (standalone)と(Visual Studio version...)がありますが、結城は前者を選びました。後者はどういうのか知りません。
  • (4) Windows用のインストーラ(たとえば ghc-6-4-2.msi )をダウンロードする。
  • (5) ダウンロードしたインストーラを開いてインストールを開始する。
  • (6) ウイザード(Setup Wizard)の指示に従って進む。
  • (7) 最後にオプションを聞かれる。
    • 結城はTypical(典型的インストール)ではなくComplete(全部インストール)を選びました。
  • (8) 環境変数PATHにGHCのパス(たとえば C:\ghc\ghc-6.4.2\bin)を追加する。
  • (9) コマンドプロンプトを開いて、以下のように表示されるかチェックする。
> ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.4.2

> ghci --version
The Glorious Glasgow Haskell Compilation System, version 6.4.2
  • (10) GHCiを動かしてみる。
> ghci
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.4.2, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base-1.0 ... linking ... done.
Prelude> print "Hello, Haskell"
"Hello, Haskell"
Prelude> :q
Leaving GHCi.
  • (11) プログラム main.hs を作って、GHCを動かしてみる。
> type main.hs
module Main where
main = do print "Hello, Haskell"

> ghc -o main.exe main.hs

> main
"Hello, Haskell"

9章に入りました 9章に入りました - 結城浩のHaskell日記 を含むブックマーク

ふつけるp.223まで読みました。

  • 静的型チェック(static type checking)
  • 型推論(type inference9
  • 明示的な型宣言
  • 型変数(type variable)と多相型(polymorphic type)

8章まで終わりました 8章まで終わりました - 結城浩のHaskell日記 を含むブックマーク

ふつけるp.219まで読みました。

  • 部分適用
  • 関数合成
  • 無名関数(λ)
  • ポイントフリースタイル

このあたりは以前たくさんやったので、すぐに読めました。

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