トップページtech
1001コメント379KB

関数型プログラミング言語Haskell Part6

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2006/11/07(火) 21:24:26
haskell.org
http://www.haskell.org/

日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://shidot.dyndns.org/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/

関連スレは>>2
関連書籍は>>3

・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0809デフォルトの名無しさん2007/02/18(日) 13:11:55
ΣをSigmaと書きましょう
0810デフォルトの名無しさん2007/02/18(日) 13:49:10
Concurrent Clean の一意型はどう思われますか?
0811デフォルトの名無しさん2007/02/18(日) 14:21:23
>>808
バルバロイはすっこんでろ!
0812デフォルトの名無しさん2007/02/18(日) 16:17:19
ギリシャ文字ってうざいよね
0813デフォルトの名無しさん2007/02/18(日) 16:53:02
>>806
海草なども使えばいいってことですか?
0814デフォルトの名無しさん2007/02/18(日) 22:07:24
ようやく元の馬鹿スレに戻ってきたなw うれしいぜ
0815デフォルトの名無しさん2007/02/18(日) 22:28:20
もったいぶった馬鹿よりはマシだな
0816デフォルトの名無しさん2007/02/18(日) 23:24:26
このスレは正真正銘のHaskeller達で構成されているわけではなくて、
Haskelになんとなく関わっていることで自分が賢くなったと思い込みたい人間が大半だからな。

その事実をはき違えて、スレの流れをHaskell本来のレベルに引き上げてもらっては困る。
0817デフォルトの名無しさん2007/02/19(月) 01:11:27
モナドが「副作用のある計算」をエミュレートするために
使われることばかり宣伝されるのが,悪影響なんだと思う.

モナドは,副作用どころではなく,もっと広いクラスの計算を
統一的な枠組みで定式化できることが本当の利点だと思うし,
副作用に限定しても,どのような副作用が入るかを厳密に
定式化できる構造を与えられることのほうが大切と思うがなあ.
0818デフォルトの名無しさん2007/02/19(月) 01:34:21
もと物理屋さんなのですが
圏論って勉強するの大変ですか?
集合論と郡論まではなら勉強したことあります
0819デフォルトの名無しさん2007/02/19(月) 01:45:56
このスレで聞くってことはプログラミングに関連するところさえ
勉強できればいいってこと? そうなら、まあまあ簡単。
PierceとかBarr,Wellsを読んで、具体的な分野の論文見れば
あっさりと追いつける。分からなかったら辞書的にMacLane。
0820デフォルトの名無しさん2007/02/19(月) 03:11:00
>>818
こんなところで質問する程度のやる気では無理
0821デフォルトの名無しさん2007/02/19(月) 17:35:02
>818
その質問に対して現状においてもっとも適切に答えをくれる場所
あるだろ・・・。
0822デフォルトの名無しさん2007/02/19(月) 18:02:06
>817
IOモナドは他のモナドとちがって
随伴使ったモナドと解すべきなんだと思う。

つまり
普通のモナド: Maybe, List, etc..
随伴で構成されたモナド: IOモナド

IOモナドで全部副作用と名のつくものを一括で処理しているのが
いろいろな鯨飲の元なんだと思う。
IOモナドを役割ごとにもっと分割させないと。
本当にIOモナドはI/Oだけ扱えばいいんだと思う。
0823デフォルトの名無しさん2007/02/19(月) 18:02:53
×鯨飲
○原因
0824デフォルトの名無しさん2007/02/19(月) 18:49:00
>>819
この本ですか?
http://www.cis.upenn.edu/~bcpierce/tapl/index.html
0825デフォルトの名無しさん2007/02/19(月) 18:50:02
>>819
psファイルがあるのですね
http://www.let.uu.nl/esslli/Courses/barr-wells.html
0826デフォルトの名無しさん2007/02/19(月) 19:55:30
>>796
函手F上のモナドってなんだ?
あんまりよくわかっていないことを言わないほうがいい。
モナドは函手じゃなくて圏の上で構成される構造だ。
だから「自己」函手なわけだよ。
0827デフォルトの名無しさん2007/02/19(月) 19:56:52
>あんまりよくわかっていないことを言わないほうがいい。

すまん。訂正。どんどんいってけーーーー。
俺もよくわかってないし。
0828デフォルトの名無しさん2007/02/19(月) 20:52:05
>>822
> 随伴で構成されたモナド: IOモナド

これってどういう意味?
IO monad = (IO, η, μ)
のIOが、何かの左 or 右随伴になってるってこと?

Listだって集合の左随伴だと思うが…
0829デフォルトの名無しさん2007/02/19(月) 20:53:18
> Listだって集合の左随伴だと思うが…
集合へのforgetful functorの随伴ね
0830デフォルトの名無しさん2007/02/19(月) 21:20:57
>>826
モナド (F,η,μ) で,特に F を明示したい場合に "monad over F" という
言い方をすることがあるので,それほど変ではないと思うよ.
0831デフォルトの名無しさん2007/02/19(月) 21:34:40
「圏論の基礎」と格闘中…
こういう話に追いつけるのはいつになることやら。
0832デフォルトの名無しさん2007/02/19(月) 22:05:34
>>829
!!!
マジで!ちょっとまてわからん。orz
orz
0833デフォルトの名無しさん2007/02/19(月) 22:09:08
>>828

あー。早とちり。

>のIOが、何かの左 or 右随伴になってるってこと?

そういう意味じゃない。どういう意味かと聞かれたら
そこを現在勉強中です。
うまく答えれません。正直そんなナチュラルに答え返されるとは思わなかった。
0834デフォルトの名無しさん2007/02/19(月) 22:16:50
>>833
モナドと随伴は一対一対応する.
(随伴が与えられると,そこからモナドが構成できる.逆に,
 任意のモナドに対して,それを構成するような随伴が存在する)
よって IO に対してそれに対応する随伴があるのは当然.

ということを言おうとしてると思って,IO の随伴を求めたけど
全然直感的でないものしか得られなかった.

これって何か解釈あるのかな? 参考文献お願いします.
08358332007/02/19(月) 22:18:07
ちょっと即興で考えて見ます。
ちょうどそれを考えられる材料がそろってきたので。
期待しないでください。
0836デフォルトの名無しさん2007/02/19(月) 23:30:53
圏論とチューリングマシンやラムダ論法って、同じ記述力なの?
それともどれかがより大きな記述力があるの?

なんで圏論なのさ?チューリングマシンでは駄目なのかよ!

チューリングがホモだからって差別してんじゃないわよ!
0837デフォルトの名無しさん2007/02/20(火) 00:02:47
>>831
コンマ圏がマンコ圏に見えて困るでしょ?
0838デフォルトの名無しさん2007/02/20(火) 01:50:36
>>834
モナドを構成する随伴は一般に複数あってそのうちの一方の端が Eilenberg-Moore の
構成でもう一方の端が Kleisli の構成、だよね。
端というのはある圏の始対象と終対象という意味で。
0839デフォルトの名無しさん2007/02/20(火) 02:46:29
10年間はlispが最強だったみたいですが
今の最強はhaskellでしょうか?
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
この人達が絶賛するlispのマクロに対応する機能も
haskellは持ってるのでしょうか?
0840デフォルトの名無しさん2007/02/20(火) 02:49:25
10年間 -> 10年前
0841デフォルトの名無しさん2007/02/20(火) 14:18:13
>>839
Haskellにはマクロはない。
Lispのことは良く知らないけど、記述力という点で
Haskellより弱いとは思えない。
0842デフォルトの名無しさん2007/02/20(火) 14:55:20
手続き型言語の方が記述力は高いもんな
0843デフォルトの名無しさん2007/02/20(火) 15:35:07
手続き型かどうかは関係なくね?
第一級の関数とかマクロとかパターン照合とかが使えるかどうかが大きいと思う。
0844デフォルトの名無しさん2007/02/20(火) 16:14:12
>>843
それは記述力とは関係なくて、エラー抑制の効果があるだけ。
0845デフォルトの名無しさん2007/02/20(火) 18:53:11
記述力ってのは型システム(の緩さ)で決まるのですよ。
その結果、Lispの方がちょっとHaskellよりも記述力が高いのですよ。

でも、多くの場面では、カチカチの型が憑いているメリットの方が大きいと思うけれど。
0846デフォルトの名無しさん2007/02/20(火) 19:30:22
冷静に考えてみると、動的型言語と同等の力が必要ならいつでも
Data.Dynamicを使える訳で、そうしないのは気持ちの問題に過ぎないのかも。
型安全でないHaskellライブラリなんて寒気がする、とか。
0847デフォルトの名無しさん2007/02/20(火) 20:01:39
>>844
マクロをエラー抑制だけと言い切るのはちょっとw
ttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%e3%83%9e%e3%82%af%e3%83%ad%e3%81%ae%e5%8a%b9%e7%94%a8
0848デフォルトの名無しさん2007/02/20(火) 20:04:38
どこでもevalれないと同等とは言いたくないぜ。
メタな要素がまざると、型とか意味論的に都合が悪いのかな
0849デフォルトの名無しさん2007/02/20(火) 22:41:56
つ hs-plugins
0850デフォルトの名無しさん2007/02/20(火) 22:43:04
ああ、まあ hs-plugins の eval は IO だから「どこでも」じゃないな
0851デフォルトの名無しさん2007/02/20(火) 23:01:37
HaskellのevalはIOとして外側の世界に出して行うしかない。
LispのevalはLispの世界で定義されている。
この差は大きいと思う。
0852デフォルトの名無しさん2007/02/20(火) 23:02:53
動的なプログラムはデバッグきつい。
性的なほうがいいね!
0853デフォルトの名無しさん2007/02/20(火) 23:11:08
最初はきついかも知れんが、動いていればだんだん滑らかになるよ。
きつい方が気持ちよい
0854デフォルトの名無しさん2007/02/24(土) 00:52:28
>>831
圏論の基礎は数学者向けの基礎なので、
普通の人は違う本を読んだほうがいいらしい。
0855デフォルトの名無しさん2007/02/24(土) 01:58:15

これから初心者の俺が朝まで生Haskellやろうかと思うんだけど
おまえら実況板並みに教えてくれないか?
08568552007/02/24(土) 06:05:17
終了しますた
0857デフォルトの名無しさん2007/02/24(土) 09:34:02
>>855-856
ワロタ
0858デフォルトの名無しさん2007/02/24(土) 17:37:24
855≠856
だってだれもレスくれねーんだもん
バベル見て寝たわ
0859デフォルトの名無しさん2007/02/24(土) 18:05:10
>>858
夜中の2時にいきなりでレスも糞もねーだろw
VIPじゃねーんだぞwwww

昼間に犯行予告をしとけよ
0860デフォルトの名無しさん2007/02/24(土) 18:43:30
犯行予告は犯罪だからその教唆も明らかに犯罪ですね。
0861デフォルトの名無しさん2007/02/24(土) 19:01:36
アスペルガーの馬鹿はすっこんでろ!
0862デフォルトの名無しさん2007/02/25(日) 02:59:15

             ∩___∩
             |ノ⌒  ⌒ ヽ
             / ●)  ●) |
        Let's  |   ( _●_)  ミ  Haskell♪
            彡、  |∪| 、`
              /  ヽノ  ヽ
             / 人    \\   彡
           ⊂´_/  )    ヽ__`⊃
                / 人 (
               (_ノ (_)
0863デフォルトの名無しさん2007/03/03(土) 00:14:49

 い ま か ら ハ ス ケ る か ら お し え て く れ
0864デフォルトの名無しさん2007/03/03(土) 00:36:30
なんでも聞きなさい。
0865デフォルトの名無しさん2007/03/03(土) 00:41:35
よーし、じゃあまだ「ふつうのHaskellプログラミング」で
Map関数までしかすすんでないんだけど、
いきなりWikiつくりはじめちゃうぞーー
0866デフォルトの名無しさん2007/03/03(土) 01:00:05
>>865
ちょwwwそれ無謀wwwwwww
0867デフォルトの名無しさん2007/03/03(土) 02:24:52
はははは 父さん元気な子は大好きだぞー
0868デフォルトの名無しさん2007/03/03(土) 02:29:12
いやーだってね
基礎を勉強したところでコードは書けるようにならないじゃない
なんか作ろうとしたほうが5倍くらい早くおぼえれる

そうだろ?父さん!
0869デフォルトの名無しさん2007/03/03(土) 02:54:28
>>868
君が一番上達する方法はしらないから、自由にすればいいよ。
0870デフォルトの名無しさん2007/03/03(土) 02:57:20
ところでこれWikiの完璧なソースはどこにあんの?
0871デフォルトの名無しさん2007/03/03(土) 09:58:10
本の丸写しだけは勘弁してほしい
0872デフォルトの名無しさん2007/03/03(土) 12:54:39
そんなアホなことはしない
0873デフォルトの名無しさん2007/03/03(土) 16:31:01
日本語よりサンプルコードの方が学習しやすい、って人もいるけど、
Haskellでそれができるとしたら「型」の概念に対して
相当鋭敏な感覚を持ってないとむつかしいような気がする。

javascriptとかだったらなんとなく見よう見まねで動きそうな気もするが。
0874デフォルトの名無しさん2007/03/04(日) 00:46:42
モナド変換子おもすれー

import Prelude hiding(either)
import Control.Monad.List
both, either :: a -> a -> ListT [] a
both a b = return a `mplus` return b
either a b = lift [a,b]
main = do
  -- Both Bill and Mary loves either Martha or John.
  print $ runListT $ do
    lover <- both "Bill" "Mary"
    lovee <- either "Martha" "John"
    return $ lover ++ " loves " ++ lovee

  -- Either Martha or John is loved by both Bill and Mary.
  print $ runListT $ do
    lovee <- either "Martha" "John"
    lover <- both "Bill" "Mary"
    return $ lover ++ " loves " ++ lovee

結論: 自然言語にも副作用があるというのにHaskellときたら(略
0875デフォルトの名無しさん2007/03/04(日) 14:31:37
> both, either :: a -> a -> ListT [] a

こんな書き方できるの初めて知った
0876デフォルトの名無しさん2007/03/06(火) 23:57:05
関数言語むつかしいよ
こういうプログラムをつくってみようと思い立ってもまったく書けない
あれ?文法どうだったっけ?みたいな
0877デフォルトの名無しさん2007/03/07(水) 00:13:36
>>876
手続き型言語で培った慣れが役に立ちにくいというだけであって、
学習の難しさはさほど変わらないんじゃなかろうか。
初めてプログラミングを習った人は大抵、
「思い立っても全く書けない」状態を経験するだろう。
0878デフォルトの名無しさん2007/03/07(水) 10:43:06
Haskellに限ればリスト覚えたら大体何とかなる希ガス
0879デフォルトの名無しさん2007/03/07(水) 20:46:20
そんなおれになんか課題だしてくれないか
ふつうのHaskellプログラミングでMAP関数のとこまでは読んだ
08808392007/03/07(水) 21:28:52
lispちょっと勉強してきました
cのプリプロセッサを強引に前処理としてかませば
lispのマクロと同じことができるかも
0881デフォルトの名無しさん2007/03/07(水) 21:36:55
どういう勉強をどれくらいしたのかは知らないけど、lispのマクロについてもっと勉強した方がいいよ。
0882デフォルトの名無しさん2007/03/07(水) 21:37:05
>>879
テキストファイルの各行を30文字に切り詰めるプログラム。
0883デフォルトの名無しさん2007/03/07(水) 21:39:07
>>880
Cプリプロセッサは実質的にチューリング完全だから能力は十分だけど、
Haskellの方がメタなことをするのに適していないような気がする。
例えば、局所的に型を宣言することができないとか。
0884デフォルトの名無しさん2007/03/07(水) 22:49:05
880じゃないけど
>Cプリプロセッサは実質的にチューリング完全だから能力は十分
これってホント?ループがかけないような
0885デフォルトの名無しさん2007/03/07(水) 22:49:53
局所的に型を宣言?ってどゆこと?
0886デフォルトの名無しさん2007/03/07(水) 22:50:39
自己includeでループはできそう。
0887デフォルトの名無しさん2007/03/07(水) 23:20:39
なるほど、define,ifdefとか組み合わせたらいけそうだな、納得
0888デフォルトの名無しさん2007/03/07(水) 23:46:56
881です。CPPがチューリング完全だとは知らなかった。その点は謝りたいと思います。


ところで、どうもまだ混乱しているんですが、自己includeのループをどう止
めたものかがわりません。 ifdef とかで何とかなるもんなの? define の再
定義では上手く行かないと思うんだけど。

たとえば階乗を計算するコードって、どんな概形になりますか?
# スレ違いすぎ?
0889デフォルトの名無しさん2007/03/07(水) 23:48:14
BOOST_PP
でループはできる
08908392007/03/07(水) 23:55:48
>>881
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3aScheme%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e3%81%ae%e3%83%ac%e3%83%99%e3%83%ab10
まだレベル1から2ぐらいです

これ以上勉強したらhaskellには戻ってこないと思う
0891デフォルトの名無しさん2007/03/08(木) 00:11:56
>>888
適当だけどこんなん用意して
#include<boost/preprocessor/slot/slot.hpp>
#ifdef N
    #define BOOST_PP_VALUE N
    #include BOOST_PP_ASSIGN_SLOT(1)
    #define BOOST_PP_VALUE 1
    #include BOOST_PP_ASSIGN_SLOT(2)
    #undef N
#endif
#if BOOST_PP_SLOT(1) == 0
    #define X BOOST_PP_SLOT(2)
#else
    #define BOOST_PP_VALUE BOOST_PP_SLOT(2)*BOOST_PP_SLOT(1)
    #include BOOST_PP_ASSIGN_SLOT(2)
    #define BOOST_PP_VALUE BOOST_PP_SLOT(1)-1
    #include BOOST_PP_ASSIGN_SLOT(1)
    #include __FILE__
#endif
こんな風に呼び出す。
#define N 6
#include "fact.c"
main(){
    printf("%d\n",X);
}
あとはC++関係のスレで
0892デフォルトの名無しさん2007/03/08(木) 00:42:45
>>888
俺が念頭に置いてたのはこんな感じ。
http://lists.boost.org/Archives/boost/att-46646/lambda.cpp

>>885
let data Foo = ... in ...
のように式の中で即席の型を作れると、C++のテンプレートの
真似ができるかと思ったが、良く考えるとそうでもなかったかも。
0893879じゃない2007/03/08(木) 01:49:32
>>882 できました!
でも、IOモナドはいまいちピンと来てないです。
あと、全部メモリに読み込んでから処理するのはいいんでしょうか(関数型だとそれがキレイ?)

import System.IO
import System.Environment
main = do args <- getArgs
      hFile <- openFile (head args) ReadMode
      content <- hGetContents hFile
      putStr $ unlines $ map (take 30) $ lines content


最後の行を
      mapM (putStrLn . (take 30)) $ lines content
にしてもいけました。

ツッコミお願いします
0894デフォルトの名無しさん2007/03/08(木) 02:03:52
>>893
お疲れさん。
>あと、全部メモリに読み込んでから処理するのはいいんでしょうか(関数型だとそれがキレイ?)
hGetContentsは全部メモリに読んでる訳じゃなく、入力は遅延する。
これはこれで気持ち悪い(副作用と紙一重)けど、便利なことは間違いない。
0895デフォルトの名無しさん2007/03/08(木) 02:18:49
単に読み込み専用で開けて読み込むだけならreadFileで良いと思う。

import System
main=getArgs>>=readFile.head>>=mapM_ putStrLn.take 30.lines
08968932007/03/08(木) 02:25:45
>>894
ありがとうございます!
Stringの値が必要になったら全読みされちゃわないんですか?
Stringのケツが必要になるまでは遅延される?

>>895
1行キタ─(゚∀゚)─!!!! まさに関数型!!!
関数合成ってそう使うんですね。初めてしっくり来ました。
08978932007/03/08(木) 02:55:18
おっとトラップ?
main=getArgs>>=readFile.head>>=(\c->mapM_ (putStrLn.take 30)$lines c)
にしないと、>>882の動きになりませんでした。
このラムダは消せないのでしょうか…?
0898デフォルトの名無しさん2007/03/08(木) 05:30:36
自分なら
main = getArgs>>=readFile.head>>=putStrLn.unlines.map (take 30).lines
とやる。
0899デフォルトの名無しさん2007/03/08(木) 06:30:58
>>897
main = getArgs >>= readFile . head >>= mapM_ (putStrLn . take 30) . lines

ちょっと分かりづらいか・・・。
0900デフォルトの名無しさん2007/03/08(木) 09:28:14
#includeで実現できるのはスタックにすぎない
よって実現できるのはプッシュダウンオートマトンであってTuring機械ではない
(外部スクリプトで複数回CPPをかけていいんならTuring完全になる)

ただしC++ templeteを使っていいならTuring完全になる
09018392007/03/08(木) 09:37:55
lispと比べたhaskellのメリットは

http://practical-scheme.net/wiliki/wiliki.cgi?Lisp%3A%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%AA%A4%E8%A7%A3&l=en
>なので、C並に速いLispコードは見た目も安全性もC並になる、というのが私 (Shiro) の経験です。

haskellの場合はC並にごちゃごちゃしなくてもC並の速度が実現できるということなのでしょうか?
0902デフォルトの名無しさん2007/03/08(木) 09:56:04
言語同士にはそんな単純に言い切れるほどはっきりとした差がつくもんじゃないよ
おもちゃベンチマークでもなければね

どうして安易な1フレーズの結論に飛びつきたがるのかなぁ
0903デフォルトの名無しさん2007/03/08(木) 10:22:58
>891
Boost だけど template を使ってるわけじゃないんだね。
漠然と、シンボルを結合したりしているのかな、とは思っていたが、うまい方法が思いつかなかったよ。ありがとう。
0904デフォルトの名無しさん2007/03/08(木) 10:38:50
>>900
>>892のリンク先のコード(β簡約器)はincludeを使っていない。
見れば分かるけど、λ式を最大nステップ簡約するマクロはO(log n)個のdefineで書ける。
だから「実質的に」チューリング完全、と書いた。

http://pc11.2ch.net/test/read.cgi/tech/1068359871/
完全にすれ違いなのでレスがあればこっちによろしく。(適当なスレが見付からなかったので)
0905デフォルトの名無しさん2007/03/08(木) 10:55:04
Boost PPの話はここに詳しい人がいると思います

Boostを語れゴラァ part3
http://pc11.2ch.net/test/read.cgi/tech/1158991211/
0906デフォルトの名無しさん2007/03/08(木) 12:15:39
>>899
最後は、mapM_の部分適用…と思って、小一時間悩みました。
最後は、(mapM_ (putStrLn . take 30)) . lines と評価されるんですね。

結合順位重要。関数適用最強…と。 _〆(。。)
0907デフォルトの名無しさん2007/03/08(木) 16:12:46
GHC使いなら -ddump-parsed をつけてコンパイルしてみるのも手かと。
0908デフォルトの名無しさん2007/03/08(木) 23:48:49
ちょっとやってみたけど


まぁまぁ面白いな
レス数が900を超えています。1000を超えると表示できなくなるよ。