クラなんとか or くらなんとか or cla なんとかの日記

2009-04-09 ちゃんと帰った

チャーチ数の続き2

C++ での実装がよくわからなくなってきたので,勉強するとして

とりあえず,関数型で書いてみた.

#!/usr/bin/env escript

main(_) ->
    Zero = fun(_) -> (fun(X) -> X end) end,
    One = add_1(Zero),
    Two = add_1(One),
    io:format("zero = ~p~n", [display_church(Zero)]),
    io:format("one = ~p~n", [display_church(One)]),
    io:format("two = ~p~n", [display_church(Two)]),
    io:format("(2 + 1) + 2 = ~p~n", [display_church(plus(add_1(Two), Two))]).

add_1(N) ->
    fun(F) ->
            fun(X) ->
                    F((N(F))(X))
            end
    end.

plus(M, N) ->
    fun(F) ->
            fun(X) ->
                    (M(F))((N(F))(X))
            end
    end.

display_church(N) ->
    Inc = fun(X) -> X + 1 end,
    (N(Inc))(0).
#!/usr/bin/env runghc

main = do let zero = \f -> \x -> x
              one = add_1 zero
              two = add_1 one
          putStrLn $ "zero = " ++ (show $ display_church zero)
          putStrLn $ "one = "  ++ (show $ display_church one)
          putStrLn $ "two = "  ++ (show $ display_church two)
          putStrLn $ "(2 + 1) + 2 = " ++
                       (show $ display_church $ plus (add_1 two) two)

add_1 n = \f -> \x -> f $ (n f) x
plus m n = \f -> \x -> (m f) $ (n f) x
display_church n = let inc = \x -> x + 1
                   in n inc 0
#!/usr/bin/env ocaml

let zero = fun f -> (fun x -> x);;

let add_1 n =
  fun f ->
    fun x ->
      f ((n f) x);;

let one = add_1 zero;;
let two = add_1 one;;

let plus m n =
  fun f ->
    fun x ->
      ((m f) ((n f) x));;

let display_church n = 
  let inc x = x + 1
  in n inc 0;;


Printf.printf "zero = %d\n" (display_church zero);;
Printf.printf "one = %d\n" (display_church one);;
Printf.printf "two = %d\n" (display_church two);;
Printf.printf "(2 + 1) + 2 = %d\n" (display_church (plus (add_1 two) two));;
  • Erlang は,最初全部 fun で書いていて 10行くらいで書いていたけど,あまりにも読めなそうなので,改行したりした.
    • fun だよね.function とかlambda とか長過ぎ
  • Haskell が短いのが楽しい
    • ラムダがバックスラッシュ一文字で書けるのも楽で良いですね
  • OCaml は,慣れてなさ過ぎですね.サーセン

もう一回くらいエントリ書けるかも.

2009-04-01 昨日のチャットで,I’m being serious about ... とか言われた

ghci

コマンド

:?
ヘルプ
:module
モジュールのロード
:info
演算子を調べることができる.優先順位とか
:type
型を表示する
:quit
終了

set/unset

+t
式の後に型を表示

かなり忘れてる

  • '-'(マイナス)は,単項演算子
  • /= は,!= みたいなもの
  • [,] みたいな最後にカンマは許してないよ(-> parse error)
  • .. は範囲.省略で無限まで.[1..] みたいな(> take 10 [100..])
  • ++ は,リスト結合,: は,コンス
  • putStrLn -> say

But its coverage of mathematical constants is not comprehensive, as we

can quickly see. Let us look for Euler's number, e.

Oh well. We have to define it ourselves.

Using ''ghci'''s let construct, we can make a temporary definition of

e ourselves.

こんな感じか.

すぐわかるように,数学的定数の定義の範囲は,包括的じゃない.

オイラー数 e を探してみよう.

おおっと,こいつは,自分たちで定義しなくちゃならない.

"ghci" の let 構築子を使って,私たちは,

自分自身の e の一時的な定義をすることができる.

This is an application of the exponential function, exp, and our first

example of applying a function in Haskell.

While languages like Python require parentheses around the arguments

to a function, Haskell does not.

With e defined, we can now use it in arithmetic expressions. The (^)

exponentiation operator that we introduced earlier can only raise a

number to an integer power. To use a floating point number as the

exponent, we use the (**) exponentiation operator.

これは,指数関数の適応で,exp のところがその部分.

これが(この本での) Haskell の関数適用の最初の例です.

Python のような言語は,関数への引数の周りに括弧を必要とするけど,

Haskell はそうじゃない.

e が定義されたので,私たちはそれを数式の中に使うことができる.

以前に紹介した指数演算子(^)は,数をべき乗して,整数のべき乗しか得られない.

浮動小数点数を使って指数を得るには,指数演算子(**)を使います.

Real World Haskell を読み始めた 情報リンクとか

Hackage によると,

Each package is in the Cabal format, a standard way of packaging

Haskell source code that makes it easy to build and install.

だそうである.

Cabal がキーワードっぽい.

http://www.amazon.co.uk/exec/obidos/ASIN/0596514980/search042-22/ref=nosim/RealWorld Haskell

2008-11-19 挑戦と無謀を履き違えるな

ocaml-nagoya にいってきた

Topics

  • ABC の勉強
  • ハナコさんが来た
  • なんかできるような気がしてきた
  • デブサミ2009 の合同に乗るぞの話
  • とあいえ,何やるのかよくわかんないとか
  • ツリーの全部のLeaf の値をツリーの全部のLeaf の値の最小値に統一するとか
  • 遅延でなんとかなってるのはわかる
  • 今んとこ自分で書ける気がしない

自分でコード書く時間が短いのでどげんかせんと.と思います.

2008-10-01 ブルーレイがプレイしたい

csnagoya の宿題の続き

そういえば,経緯を言ってませんでした.

前回のcsnagoya で,一日一言語実装するとか冗談で言ったののアレです.

経緯終わり.

ということで,みなさん大好きHaskell です.

Erlang の次に興味津々かと思います.

ふつうのHaskell しか読んでませんが,Web を教科書に頑張ってみよー.

とりあえず,この辺を参考に

haskell_parsec.html んとこ,<?> が見えてなかったので,困った.

原文を読んでわかった.

とあいえ,lexer のところまで全然わかりませんでした><

module Main where
import Text.ParserCombinators.Parsec

data Primitive = Primitive [Item] deriving Show
data Item = Item { def :: String, str :: String } deriving Show

main = do cs <- getContents
          run primitive cs

run :: Show a => Parser a -> String -> IO ()
run p input = case (parse p "" input) of
                Left err -> do { putStr "parse error at ";
                                 print err }
                Right x -> print x

primitive :: Parser Primitive
primitive = do items <- many item
               eof
               return (Primitive items)

item :: Parser Item
item = do r <- reserved
          spaces
          return r
   <|> do id <- identifier
          spaces
          return id
   <|> do sym <- symbol
          spaces
          return sym
   <|> do v <- value
          spaces
          return v

reserved :: Parser Item
reserved = do str <- ( string "MODULE"
                   <|> string "BEGIN"
                   <|> string "END" )
              return (Item str str)

identifier :: Parser Item
identifier = do a <- letter
                b <- many1 ( letter <|> digit )
                return (Item "IDENT" (concat [[a], b]))

symbol :: Parser Item
symbol = do sym <- string "("
            return (Item "OPEN" sym)
     <|> do sym <- string ")"
            return (Item "CLOSE" sym)
     <|> do sym <- string ";"
            return (Item "SEMICOLON" sym)
     <|> do sym <- string ":"
            return (Item "COLON" sym)
     <|> do sym <- string "."
            return (Item "PERIOD" sym)

value :: Parser Item
value = do char '"'
           str <- manyTill anyChar (try (char '"'))
           return (Item "STRING" str)
    <|> do n <- many1 digit
           return (Item "INTEGER" n)

これは持ち越しですね.

2008-08-10

ほんとうのはじめてのHaskellの終了

OSC2008 の直後なので,出席した人はちょっとお疲れのご様子.

Topic

  • 楽器やろうぜ.三味線とか?
  • 趣味を持った方がよい.ロケット制作とかどぉ?
  • 極みって,二重的なの?
  • やう゛ぁとんオフ的な意味で.
  • すねーくみっしょん?
  • Pugs を読むといいって,吉岡さんが言ってたらしい

勉強会的には,13章あたりの復習的なとこでしょうか?

次回からコンパイラらしいです.

C# に拘らず,オレオレ言語を好きな言語(速い者勝ち)で実装するっぽい話?

ドラゴンとか読めとかですかね?

とりあえず,薄いのを見てから欲しくなったら買おう.

あ,あと読み終えたんだけど,全然わからないので,個人的にはもうちょっと勉強するつもり.

Haskell のリファレンスってダウンロードできるのかな?