約 2,107,918 件
https://w.atwiki.jp/knenethaskell/
knenetがHaskellについて調べたことを忘れないように、覚え書きをするよ。 適当に書いたコードも出来るだけ乗せるようにするつもりなんだ。 せっかくのwikiだけど、きちんと使うのは面倒だからかなり適当に書くよ。 haskellについて、丁寧な説明が欲しい人はバリケンさんところのを参照すると良いよ。 何となく感化されてるけど、まあいつもこんな感じだから仕方がない。 ●順路 haskellって? 処理系を導入する 基本的なソース 型とクラス スーパークラス ●ここから先は分岐するよ。 一応書き残しがないか探しやすいようにガイドを付けておこう。 スーパークラス(続き) 型構築子 print main関数 副作用 束縛 色々な型 多重定義 タプル ●第二部 分岐を続けるのも大変だし、他のところを参照しないといけなくなってきたので、ここで合流。 上の項目が終わったらこっちに進むよ。 入出力 と思ったけど、書いているうちに面倒くさくなったので、はてなグループに移行するよ。 アドレスはhttp //haskell.g.hatena.ne.jp/knenet/だよ。 内容を移転するのも面倒くさいので、こちらはしばらく残しておくよ。
https://w.atwiki.jp/kenichiro90/pages/17.html
(この章でのすべての例は、Haskellソースファイルで書かれていて、GHCもしくはHugsによりそのファイルは読み込まれ評価することが可能です。) 変数 前章では、どのようにして加算や減算のような簡単な算術演算子を使うのかということを学びました。簡単なクイズです:半径5cmの円の面積は?心配しないでください。間違ってもWikibookの幾何学で躓いてはいません。 円の面積は、πr^2で、ここでは、rは半径(5cm)で、πは簡単のために3.14とします。なので、GHCiで試してみましょう。 GHC Interactive, version 6.4.1, for Haskell 98. http //www.haskell.org/ghc/ Type ? for help. Loading package base-1.0 ... linking ... done. Prelude 考えて見ましょう。π(3.14)を半径の2乗にかけたいので、それは、次のようになります。 Prelude 3.14 * 5^2 78.5 すばらしい!今、私たちの計算を助けてくれる素晴らしい、強力なコンピュータを持っているので、πを小数点2桁に近似する必要はまったくありません。同じことをしましょう。しかし、πの値は少し長くしています。 Prelude 3.14159265358979323846264338327950 * (5 ^ 2) 78.53981633974483 よりよくなりました。なので、今、円の円周はどのくらいでしょうか(ヒント:2πr)? Prelude 2 * 3.14159265358979323846264338327950 * 5 31.41592653589793 もしくは、半径が25の異なった円の面積はどのくらいでしょうか(ヒント:πr^2)? Prelude 3.14159265358979323846264338327950 * (25 ^ 2) 1963.4954084936207 私たちがここで望むことは、遅かれ早かれ、あなたたちが、すべてのテキストをインタープリタに入力する(もしくは、コピー&ペーストする)ことに飽き始めているということです(あなたたちのいくらかは、コマンドラインで、上矢印とEmacsスタイルの切り取るキーバインドに気づいているでしょう)。私たちが主張するプログラミングにおける全体のポイントは、百万回も円周率の20桁を入力するような、愚かで、つまらない、繰り返しの作業を避けることです。私たちに必要なことは、円周率の値を記憶させる方法です。つまり、以下のようなことです。 Prelude let pi = 3.14159265358979323846264338327950 ここで、文字通りにHaskellに"piは3.14159...に等しいものとする"と教えます。このことは、piが新しい変数であることを示します。この変数piは、今、数字が3.14159265358979323846264338327950であるということを定義しています。これは、非常に便利でしょう。なぜならば、piともう1度入力することで、保存した値を呼び出すことを意味するからです。 Prelude pi 3.141592653589793 失われた桁すべてのことを心配しないでください。なぜなら、値を表示するときに、ただ飛ばしているだけだからです。すべての桁は、次の計算のいずれかで使われるでしょう。 変数を使うことは、いくつかの退屈なことを除くことです。では、半径5cmの円の面積は?半径25cmの場合は? Prelude pi * 5^2 78.53981633974483 Prelude pi * 25^2 1963.4954084936207 Note この本で、私たちが"変数"と呼ぶものは、関数型プログラミングを紹介するために"シンボル"のようにしばしば言及されています。このことは、ほかの言語、すなわち、より有名な命令的な言語において変数は非常に異なった使い方をされているからです。つまり、状態の後をつけるということです。Haskellでの変数は、このようのことをしません。つまり、変数は値を記憶し、しかもその値は普遍の値です。 型 前の例の次に、半径の値を代入したいと思うでしょう。さあ、何が起きるか見てみましょう。 Prelude let r = 25 Prelude 2 * pi * r interactive 1 9 Couldn t match `Double against `Integer Expected type Double Inferred type Integer In the second argument of `(*) , namely `r In the definition of `it it = (2 * pi) * r おっと!あなたたちは、ちょうど型として知られたプログラミングの概念に出くわしました。 関数 関数の中の関数
https://w.atwiki.jp/asato/pages/8.html
hello do show 関数その1 その2 hello module Main where main = putStr "hello" 実行結果: hello do module Main where main = do putStr "hello\n" putStr "hello\n" putStr "hello\n" 実行結果: hello hello hello あるいは: module Main where main = do putStrLn "hello" putStrLn "hello" putStrLn "hello" 実行結果: hello hello hello show module Main where main = putStr (show 111) 実行結果: 111 あるいは: module Main where main = putStr $ show 111 実行結果: 111 あるいは print 関数を使う: module Main where main = print 111 実行結果: 111 関数 その1 module Main where addStar s = "*" ++ s ++ "*" main = putStr $ addStar "aaa" 実行結果: *aaa* その2 module Main where add x y = x + y main = putStr $ show $ add 1 2 実行結果: 3
https://w.atwiki.jp/nanakoso/pages/11.html
(2006年04月26日) Parsecを使ってみる。 (2006年04月21日) Haskellの(? (2006年04月20日) 決定版:モナド3点セット(M,ext,unit)に対応するHaskell関数 (2006年04月20日) モナド3点セット(M,ext,unit)のHaskell対応の訂正 (2006年04月19日) 世界一やさしいモナド解説を読んで
https://w.atwiki.jp/nanakoso/pages/14.html
駄目日記/2006年04月20日/決定版:モナド3点セット(M,ext,unit)に対応するHaskell関数 駄目日記/2006年04月20日/モナド3点セット(M,ext,unit)のHaskell対応の訂正 #blognavi
https://w.atwiki.jp/avernum/pages/391.html
種族・所属 人間(Avernum) 性別 女性 解説 Exodusの錬金術師。 Lysstakの盗賊団からの手紙で脅されて、主人公たちを敵の待ち伏せする地下に誘導した。 Avernum6の時期、危険になったNorthern Frontierから避難し、政府によってAlmaria近郊に新たな工房を与えられた。 登場作品・場所・役職等 Avernum5 Exodusの工房 錬金術師 Avernum6 Almaria東門外の工房 備考
https://w.atwiki.jp/kenichiro90/pages/14.html
Haskell-Wikibooks(和訳) なんとなく外形ができたところです。 ほかのサイトを翻訳するかわかりませんが、ぼちぼち翻訳していこうと思います。このページは自由に編集できるので、新たなページを勝手に作成してもかまいません。
https://w.atwiki.jp/nanakoso/pages/23.html
ここ→配列操作の比較表に触発されて、Rubyの文字列メソッドの対応物をJavaとHaskellで探してみました。 Javaの文字列処理がそれほど高機能じゃないのはある程度想定内だったけど、Haskellもなかなか1対1の対応物がない。 lines,unlinesとか逆にあまったけど。 そもそもHaskellのソレって文字列処理用っていうよりほとんど汎用リスト操作関数なわけで。 Haskellって 「汎用性の高い関数を用意したから自由に組み合わせて使ってね」 って思想だと思うわけで。 カリー化された関数の強力な応用力とあいまってこれはこれで一つの便利さの方向性だとはおもう。 ただこれの欠点は 「もっとエレガントで短い書き方があるんじゃないか?」 って不安がいつまでも付きまとう事。 (しかもタチの悪い事にパズルみたいで楽しすぎる!) 自分の修行が足りなくてイディオムを知らないせいもあるけどね。 (これ調べてるうちに、HaskellでLhaにもいろいろ直したいところが!) Javaのパッケージ名やHaskellのモジュール名を明示するため、必要なものは完全名で書きました。 (実際ほとんどの場合ソースの頭でimport文を使って短くかけるようにします。) Ruby (String) Java Haskell s = abc String s = abc s = abc s = x + y s = x + y s = x ++ y s == x s.equals(x) s == x s % [x, y] sprintf(s, x, y) String.format(s, x, y)//J2SE5.0より Text.Printf.printf s x y [x, y, z].join(s) foldr1 (¥a b- a ++ s ++ b) [x,y,z] s.capitalize s.capitalize! s.casecmp(x) // s.equalsIgnoreCase(x) // ってのがあるけど同値判定だけだし、、 s.center(x) s.chomp s.chomp! s.chop init s s.chop! s.clear // sbはStringBuffer型 sb.setLength(0); s.concat(x) // sbはStringBuffer型 sb.append(x); s.count(x) length filter (flip elem x) s s.crypt(x) s.delete(x) filter (flip notElem x) s s.delete!(x) s.downcase s.toLowerCase() map Data.Char.toLower s s.downcase! s.each_byte {|x| ... } for(int i=0; i s.length(); i++){ char x = s.charAt(i); ... } mapM_ (¥x- ...) s -- 副作用を含む処理を順次起動するって意味では mapM_で正解だけど、...のところはモナドじゃないといけない。 実際そこまでは要らなくて集計値とか計算結果のリストが欲しいだけで foldシリーズやただのmapで十分ってことも多いと思われる。 //J2SE5.0より for(char x s.toCharArray()){ ... } s.each_line {|x| ... } String[] xs = s.split( ¥n ,-1); for(int i=0 ; i xs.length; i++){ String x = xs[i]; ... } mapM_ (¥x- ...) $ lines s //J2SE5.0より for(String x s.split( ¥n ,-1)){ ... } s.empty? s.length() == 0 null s s.end_with?(x) s.endsWith(x) Data.List.isSuffixOf x s s.gsub(x, y) s.replaceAll(x, y) s.gsub!(x, y) s.hex s.to_i(16) Integer.parseInt(s,16) s.include?(x) s.indexOf(x) = 0 s.index(x) s.indexOf(x) s.insert(i, x) // sbはStringBuffer型 sb.insert(i,x); s.length s.size s.length() length s s.ljust(x) s.lstrip dropWhile Data.Char.isSpace s s.lstrip! s.match(x) s.matches(x) x.match(s) java.util.regex.Pattern.matches(x, s) s.next s.succ s.next! s.succ! s.oct s.to_i(8) Integer.parseInt(s,8) s.partition(x) Data.List.partition x s s.replace(x) s.reverse reverse s s.reverse! // sbはStringBuffer型 sb.reverse(); s.rindex(x) s.lastIndexOf(x) s.rjust(x) s.rpartition(x) s.rstrip s.rstrip! s.scan(x) { ... } TODO s[i] s.slice(i) s.charAt(i) s !! i s[i..-1] s.slice(i..-1) s.substring(i) drop i s s[i, l] s.slice(i, l) s.substring(i,i+l) take l $ drop i s s[i..j] s.slice(i..j) s.substring(i,j+1) take (l-i+1) $ drop i s s[i...j] s.slice(i...j) s.substring(i,j) take (l-i) $ drop i s s.split(x) s.split(x) s.start_with?(x)*4 s.startsWith(x) Data.List.isPrefixOf x s s.strip s.trim() s.strip! s.sub(x, y) s.sub!(x, y) s.swapcase s.to_f Float.parseFloat(s) read s --この式が使用される場所の型によって適宜、変換関数の実装が(コンパイル時に)選択される(多相型) s.to_i Integer.parseInt(s) read s --同上 s.tr!(x, y) s.tr_s!(x, y) s.unpack(x) s.upcase s.toUpperCase() map Data.Char.toUpper s s.upcase! Regexp.escape(s) Regexp.quote(s)
https://w.atwiki.jp/knenethaskell/pages/19.html
突然main関数なんて出したけど、これの必要性について説明しよう。 今までは、関数を適当に定義して、対話式インタプリタで呼び出していた。 でも、独立した実行形式のファイルを作った場合はどうだろう? windowsなどのOSは役所仕事なので、haskellのコードが持つ関数を理解してくれない。 だから、こちらから何を評価すれば良いか教えなくてはいけない。 そのための関数がmainなんだ。実行形式にすると、まずmain関数が呼び出される。 それじゃあ、main関数を持つソースコードを作ってみよう。 ちなみに、main関数は基本の関数なので、これを利用するだけのコードならモジュールの指定は要らない。 勝手にMainというモジュールだと解釈してくれるんだ。 それと、mainを用いたソースは、名前をmainにすると意味が分からないから、適当に名前を付けてね。 ここではhello.hsにするよ。 main = [[print]] "Hello, world!" とりあえずコンパイルして実行形式を作ってみよう。 ここでは、コンソールを行き来するのが面倒なので、GHCiから呼び出すね。 !コマンドを使うと、システムのコンソールコマンドを使えるんだ。 Prelude !ghc -o hello hello.hs hello.exeのような実行形式が出来たかな? サイズは結構大きいね(汗 まあ、実行してみよう。 Prelude !hello "Hello, world!" うん、問題ないね。 さて、このプログラムは1文だけだから良いけど、もっと複雑なプログラムはどうしよう? 関数の定義は基本的に1文だから、これじゃあ作れないぞ? ということは当然なくて、こういう風に書けばいいらしい。 main = do print "Hello, World!" print "Welcome to haskell!" printの頭は揃ってないといけないよ。そういう失敗は良くやるから、ちょっと動かしてエラー文を確認しておこう。 doについての情報はGHCiでは見つからない。後で調べてみよう。 ともあれ、これをコンパイルして実行するとこうなる。 *Prelude !ghc -o hello print.hs *Prelude !hello "Hello, World!" "Welcome to haskell!" doを使うと、命令文のようになるね。 これでmainが2行以上になるプログラムを作れるようになった。 他の言語では普通だけど、関数型言語は喜ぶところね。 今度はGHCiに戻って、型を分析しよう。 と、ここで関数を一つ紹介。他のサイトでは最初にでてくると思うけど、 Prelude putStrLn "banana" banana putStrLnは文字列の内容を表示するんだ。 printに比べて大文字を使ってたり複雑っぽいから、説明を後回しにしてた。 これも使って、次のモジュールを作ろう。 module Test3 where f1 = print "Hahaha!" f2 = do print "Hehehe!" f3 = do putStrLn "Hohoho!" print 1023 g1 m1 m2 = do putStrLn m1 putStrLn m2 g2 a b = do print a print b 実行結果は大体予想通りなので省略するよ。型を見てみよう。 *Test3 t f1 f1 IO () *Test3 t f2 f2 IO () *Test3 t f3 f3 IO () *Test3 t g1 g1 String - String - IO () *Test3 t g2 g2 (Show a1, Show a) = a - a1 - IO () printの返り値がIO ()で、他の書き方をしてもIO ()になるようだね。 引数は関係ないようだ。 mainは、このように返り値がIO aになる関数じゃないといけないんだ。 試しに、そうでない関数にしてコンパイルすると、 main = "fail" Prelude !ghc -o fail fail.hs fail.hs 1 0 Couldn't match `IO a' against `[Char]' Expected type IO a Inferred type [Char] In the first argument of `GHC.TopHandler.runMainIO', namely `main' When checking the type of the main function `main' IO aでないとダメだって注意される。 ここで、Cを知っている人は比べてみて欲しい。 #include stdio.h int main(void){printf("ゴッゴル");printf("ヤッヒョイ");return 0;} //動くかな、これ。 Cの関数も、文字を表示するだけのプログラムで、使いもしない返り値を要求される。 Cの場合は、main関数の返り値の型は気にしないけど、haskellの場合はIO型になるんだ。 IO型というのはいまいち分からないけど、普通の型とは違うようだね。 次はその辺りを調べてみようかな。 と、この先は、さんざん分岐した方の説明も見てないと分からなくなるから、選択肢を拡げるのは一時停止。 他の経路と合流して次の段階に進もう。次は入出力にしよう。
https://w.atwiki.jp/nanakoso/pages/17.html
駄目日記/2006年04月21日/Haskellの(? #blognavi