<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/nanakoso/">
    <title>Haskellの駄目な使い方</title>
    <link>http://w.atwiki.jp/nanakoso/</link>
    <atom:link href="https://w.atwiki.jp/nanakoso/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>Haskellの駄目な使い方</description>

    <dc:language>ja</dc:language>
    <dc:date>2006-10-29T01:37:35+09:00</dc:date>
    <utime>1162053455</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/23.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/22.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/21.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/20.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/19.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/18.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/17.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/16.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/15.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/nanakoso/pages/14.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/23.html">
    <title>文字列処言語間理比較表</title>
    <link>https://w.atwiki.jp/nanakoso/pages/23.html</link>
    <description>
      ここ→&lt;a href=
&quot;http://0xcc.net/blog/archives/000137.html&quot;&gt;配列操作の比較表&lt;/a&gt;に触発されて、Rubyの文字列メソッドの対応物をJavaとHaskellで探してみました。&lt;br&gt;

&lt;br&gt;
Javaの文字列処理がそれほど高機能じゃないのはある程度想定内だったけど、Haskellもなかなか１対１の対応物がない。&lt;br&gt;

lines,unlinesとか逆にあまったけど。&lt;br&gt;
&lt;br&gt;
そもそもHaskellのソレって文字列処理用っていうよりほとんど汎用リスト操作関数なわけで。&lt;br&gt;

&lt;br&gt;
Haskellって&lt;br&gt;
「汎用性の高い関数を用意したから自由に組み合わせて使ってね」&lt;br&gt;

って思想だと思うわけで。&lt;br&gt;
カリー化された関数の強力な応用力とあいまってこれはこれで一つの便利さの方向性だとはおもう。&lt;br&gt;

&lt;br&gt;
ただこれの欠点は&lt;br&gt;
「もっとエレガントで短い書き方があるんじゃないか？」&lt;br&gt;

って不安がいつまでも付きまとう事。&lt;br&gt;
（しかもタチの悪い事にパズルみたいで楽しすぎる！）&lt;br&gt;
自分の修行が足りなくてイディオムを知らないせいもあるけどね。&lt;br&gt;

（これ調べてるうちに、&lt;a href=
&quot;http://www3.atwiki.jp/nanakoso/pages/4.html&quot;&gt;HaskellでLha&lt;/a&gt;にもいろいろ直したいところが！）&lt;br&gt;

&lt;br&gt;
&lt;br&gt;
Javaのパッケージ名やHaskellのモジュール名を明示するため、必要なものは完全名で書きました。&lt;br&gt;

（実際ほとんどの場合ソースの頭でimport文を使って短くかけるようにします。）&lt;br&gt;

&lt;br&gt;
&lt;br&gt;
&lt;table style=&quot;width: 485px; height: 3076px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;Ruby (String)&lt;/th&gt;
&lt;th&gt;Java&lt;/th&gt;
&lt;th&gt;Haskell&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;s = &quot;abc&quot;&lt;/td&gt;
&lt;td&gt;String s = &quot;abc&quot;&lt;/td&gt;
&lt;td&gt;s = &quot;abc&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;s = x + y&lt;/td&gt;
&lt;td&gt;s = x    </description>
    <dc:date>2006-10-29T01:37:35+09:00</dc:date>
    <utime>1162053455</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/22.html">
    <title>駄目日記/2006年05月29日</title>
    <link>https://w.atwiki.jp/nanakoso/pages/22.html</link>
    <description>
      -[[駄目日記/2006年05月29日/今回はHaskellともKISSとも関係ないmixiについて。]]
#blognavi    </description>
    <dc:date>2006-05-29T11:15:57+09:00</dc:date>
    <utime>1148868957</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/21.html">
    <title>駄目日記/カテゴリ/雑記</title>
    <link>https://w.atwiki.jp/nanakoso/pages/21.html</link>
    <description>
      -(2006年05月29日)&amp;nbsp;&amp;nbsp;[[今回はHaskellともKISSとも関係ないmixiについて。&gt;駄目日記/2006年05月29日/今回はHaskellともKISSとも関係ないmixiについて。]]    </description>
    <dc:date>2006-05-29T11:15:57+09:00</dc:date>
    <utime>1148868957</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/20.html">
    <title>駄目日記/2006年05月29日/今回はHaskellともKISSとも関係ないmixiについて。</title>
    <link>https://w.atwiki.jp/nanakoso/pages/20.html</link>
    <description>
      #blognavi

http://d.hatena.ne.jp/another/20060528/1148822562
を読んでチョット思うところあったので。

mixi（さらにいえばSNS全般について）

＜強調＞複数アカウントを禁止するのであれば＜／強調＞

マイミクとコミュニティのクラスタリングをサポートしてほしい。
（ひょっとして他のSNSに似たようなのがあったりして）

たとえば、実際おいらのmixiは
エロ同人つながりのマイミクがたくさんいるけど
そのおかげで数学、プログラミング関係の込みユニティに入るのは
躊躇しちゃうんだよね。
自分も恥ずかしいし実際に嫌がるひともいそうだし。
（エロマンガ家のマイミクの人で実際はじかれたりしている人もいるし。コミュじゃなくて個人にだけど）

そんなわけで、
クラスタは個人ごとに自由に作成、設定、できるようにして、
エロ同人クラスタつながりで見に来た人にはエロクラスタつながりしか見えないし
プログラミングクラスタつながりで来た人にはそのクラスタしか見せない。
両方にマイミク（コミュ）をもっている人だけその人の全貌が見える。
みたいなのがほしい。

リアルライフを振り返ってみても、
『知り合った以上はすべての人間関係を晒さなければならない』
というのはちょっと要求が高すぎる。

仕事関係と趣味の関係で２つ以上の顔を使い分けている人はきっと沢山いるわけで
複数アカウントを認めない限りは需要はあると思う。

つらつらとここまで書いてみて思ったけど、

特定アカウントの個人を弾く機能が実際ある以上、
この手の機能をサポートしないのは
倫理的な片手落ちじゃないかとすら思えてきたぞ。

（mixiの機能一覧をよくしらべないでここまで書いたけど
有料オプションとかにすでにあったらどうしよう？）

ていうか全部mixiで遣る必要もないんじゃね？っていわれると
そのとおりですとしかいえないけど。

追記、
よく考えたら自分の書く日記やプロフィールも全部クラスタ指定できないと
意味がないと気がついた。
ていうか、メンドクサス。複数アカウント使いわけるのと変わらんわ！

追記２
http://ised.glocom.jp/ised/070    </description>
    <dc:date>2007-06-28T13:21:20+09:00</dc:date>
    <utime>1183004480</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/19.html">
    <title>駄目日記/2006年04月26日</title>
    <link>https://w.atwiki.jp/nanakoso/pages/19.html</link>
    <description>
      -[[駄目日記/2006年04月26日/Parsecを使ってみる。]]
#blognavi    </description>
    <dc:date>2006-04-26T17:53:50+09:00</dc:date>
    <utime>1146041630</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/18.html">
    <title>駄目日記/2006年04月26日/Parsecを使ってみる。</title>
    <link>https://w.atwiki.jp/nanakoso/pages/18.html</link>
    <description>
      #blognavi

このサイトでは最終的にHaskellで[[KISSローダー&gt;http://www.kiss-wkp.com/]]を作るという野望があるわけで。

今回は、コンフィグファイルの読み込みで使うであろう、Parsecに手を付けてみました。

[[Parsecのサイト&gt;http://www.cs.uu.nl/~daan/parsec.html]]

Parsecを使えば簡単にLL(n)文法のテキストファイルを簡単に読み込めるようになるらしいです。（理論的なことはよくわかってない）

自分は、上記のサイトのparsec-2.0.zip をダウンロードしてきたあと、Hugsの作業フォルダにTextフォルダ以下を展開しました。こうすればとりあえずは使えるようになります。
（詳しくはHugsやGHCのマニュアルを読んでください）

-Parsecの特徴
Yacc+LexやJavaCCが「文法ファイルからプログラムソースを自動生成するツール」なのに対し、Parsecは「ただのHaskellのライブラリ」です。
本体の言語のほかに「文法ファイルの文法」を覚える必要がありません。

-とりあえず試してみる
 module Main where
 import Text.ParserCombinators.Parsec
 
 paren :: Parser Char
 paren = (char &#039;{&#039;) &gt;&gt; (char &#039;}&#039;)
こんだけ。
見れば分かるとおりモナドです。
まず文字列の頭から&#039;{&#039;かどうかチェックして次に&#039;}&#039;かどうかチェックしてます。
 Main&gt; parseTest paren &quot;{}&quot; ← parseTestはParsecの関数
 &#039;}&#039;                        ← 成功したのか？

Main&gt; parseTest paren &quot;{x}&quot;  ← わざと間違ってみる。
parse error at (line 1, column 2): ← それっぽいエラーが。
unexpected &quot;x&quot;
expecting &quot;}&quot;

どうやらうまくいってる様子。
パース成功したときに&#039;}&#039;とでているのは後述。

もちろんモナドだからdo構文だって使えます。
     </description>
    <dc:date>2006-04-26T17:53:50+09:00</dc:date>
    <utime>1146041630</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/17.html">
    <title>駄目日記/2006年04月21日</title>
    <link>https://w.atwiki.jp/nanakoso/pages/17.html</link>
    <description>
      -[[駄目日記/2006年04月21日/Haskellの(&gt;&gt;=)の正体]]
#blognavi    </description>
    <dc:date>2006-04-21T15:01:11+09:00</dc:date>
    <utime>1145599271</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/16.html">
    <title>駄目日記/2006年04月21日/Haskellの(&gt;&gt;=)の正体</title>
    <link>https://w.atwiki.jp/nanakoso/pages/16.html</link>
    <description>
      #blognavi

ここ数日のモナドのどたばたで得た
結論めいたものをちょっとまとめておきます。

-Haskellの演算子(&gt;&gt;=)は、実質的には圏論のモナド(M, ext, unit)の ext(拡張)そのものである。
-ただし、２項演算子として使いやすいようにextの第一引数と第二引数を入れ替えてある。
つまり
 ext = (flip (&gt;&gt;=)) = (=&lt;&lt;)
 --flip f a b = f b a
なわけでした。

当初 
 m &gt;&gt;= f = (ext f) $ m
と捉えていたせいで「ext になぜ関数適用($)がくっついているんだろう。」と疑問でしたが,
 (&gt;&gt;=) m f = ext f m
と書けば、単に引数が逆なだけだったのでした。

以下ちょっと蛇足？

 f3( f2( f1 ) )
という式があってこれをモナドで拡張すると、
 (ext f3&#039;) ( (ext f2&#039;) ( f1&#039; ) ) --ただしf1&#039;はf1のモナド版
参照：[[世界で一番やさしい「モナド入門」&gt;http://d.hatena.ne.jp/m-hiyama/20060419/1145432492]]

これをHaskellの中置演算子記法で変形すると
 f3&#039; `ext` f2&#039; `ext` f1&#039;
と右→左の順番になります。
もとのf3( f2( f1 ) )をあらわす関数結合が f3.f2.f1ですから当然なのかも知れませんが。

ただ、Haskellを作った人はたぶん「これはちょっと不便だ」と考えて、
原義の ext の引数の順序を入れ替えて(&gt;&gt;=)を作ったのでしょう。
 f1&#039; &gt;&gt;= f2&#039; &gt;&gt;= f3&#039;
そのお陰でいま私たちはIO処理を
普段文章を読むのと同じ順序・方向で書けるわけなのでした。

(すでに檜山さんのところのコメント欄や酒井さんやブクマなどで散々指摘されてきた内容が
私の脳にしみこむのにここまでかかってしまいました。)

#right{
カテゴリ: &amp;#x5b;[[プログラミング&gt;駄目日記/カテゴリ/プログラミング]]&amp;#x5d; - &amp;trackback() - 2006年04月21日 15:00:13
}
#comment(nostyle,    </description>
    <dc:date>2006-04-21T15:24:06+09:00</dc:date>
    <utime>1145600646</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/15.html">
    <title>駄目日記/2006年04月20日/決定版：モナド３点セット(M,ext,unit)に対応するHaskell関数</title>
    <link>https://w.atwiki.jp/nanakoso/pages/15.html</link>
    <description>
      #blognavi

（副題・ラムダの森の青い鳥）

前回の[[エントリ&gt;http://www3.atwiki.jp/nanakoso/pages/13.html]]で
檜山さんの[[「世界一やさしいモナド入門」&gt;http://d.hatena.ne.jp/m-hiyama/20060419/1145432492]]と[[フォロー&gt;http://d.hatena.ne.jp/m-hiyama/20060420/1145496419]]の、
「モナドを構成する三つ組のうちの一つ (ext) に直接対応するHaskell関数が見つからない」と書いたトコロ、
はてなブックマークで

「(=&lt;&lt;)なんじゃない？」

という指摘を受けました。

ご存知のとおり（あるいは字面からのご想像のとおり）
本来この関数の使い道は
 getLine &gt;&gt;= putStrLn 
と書くところで 左右逆に 
 putStrLn =&lt;&lt; getLine
と書けるようにしただけのもので、
今まで「ごくまれに便利かも知れないユーティリティ関数」
程度の認識でした。

しかしこの演算子の型は当然、
 (&gt;&gt;=) :: M a -&gt; (a -&gt; Mb)  -&gt; M b
の第１引数と第２引数を入れ替えた
 (=&lt;&lt;) :: (a -&gt; Mb) -&gt; M a -&gt; M b
なわけで
さらに、略された右結合の括弧を書き加えると
 (=&lt;&lt;) :: (a -&gt; M b) -&gt; (M a -&gt; M b)
これは求めるext関数の型です。

外面だけでなく、今度は関数の意味するところを考えてみます。

(=&lt;&lt;)は本来２項演算子ですがHaskellですからもちろんカリー化されているわけで、
第一引数にfを代入した状態(f=&lt;&lt;)の意味を考えてみると、

「モナドを受け取ってfを適用してモナドを返す関数(M a -&gt; M b)」
まさにfをextで拡張した関数となっています。

あとは実験あるのみ。

bb.hs
 module Main where
 import Monad
 
 -- (&gt;&gt;=) を(=&lt;&lt;)で作ってみる。
 -- m &gt;&gt;= f = (ext f) $ m のextに(=&lt;&lt;)を入れればよい。
     </description>
    <dc:date>2006-04-20T21:29:21+09:00</dc:date>
    <utime>1145536161</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/nanakoso/pages/14.html">
    <title>駄目日記/2006年04月20日</title>
    <link>https://w.atwiki.jp/nanakoso/pages/14.html</link>
    <description>
      -[[駄目日記/2006年04月20日/決定版：モナド３点セット(M,ext,unit)に対応するHaskell関数]]
-[[駄目日記/2006年04月20日/モナド３点セット(M,ext,unit)のHaskell対応の訂正]]
#blognavi    </description>
    <dc:date>2006-04-20T12:21:43+09:00</dc:date>
    <utime>1145503303</utime>
  </item>
  </rdf:RDF>
