関数型プログラミング言語Haskell Part6
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/11/07(火) 21:24:26http://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の仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0002デフォルトの名無しさん
2006/11/07(火) 21:25:26・関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
・【数学者】Haskellはクソ言語【オナニー】
http://pc8.2ch.net/test/read.cgi/tech/1128011645/
・純粋関数型言語Concurent Clean
http://pc8.2ch.net/test/read.cgi/tech/1075629340/
・関数型言語ML(SML, OCaml, etc.), Part 4
http://pc8.2ch.net/test/read.cgi/tech/1133003340/
・((Common Lisp) (Scheme) :Part 15)
http://pc8.2ch.net/test/read.cgi/tech/1151025773/
・【入門】CommonLispその2【質問よろず】
http://pc8.2ch.net/test/read.cgi/tech/1140012484/
・Emacs Lisp 2
http://pc8.2ch.net/test/read.cgi/tech/1068467385/
0003デフォルトの名無しさん
2006/11/07(火) 21:25:57・Introduction to Functional Programming Using Haskell
http://www.amazon.co.jp/exec/obidos/ASIN/0134843460/
・Haskell: The Craft of Functional Programming
http://www.amazon.co.jp/exec/obidos/ASIN/0201342758/
・The Fun of Programming
http://www.amazon.co.jp/exec/obidos/ASIN/1403907722/
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
http://www.amazon.co.jp/exec/obidos/ASIN/0521644089/
・入門Haskell
http://item.rakuten.co.jp/book/1794880/
・ふつうのHaskellプログラミング
http://item.rakuten.co.jp/book/4052963/
0004デフォルトの名無しさん
2006/11/07(火) 21:42:35乙カリー
0005デフォルトの名無しさん
2006/11/07(火) 22:47:22【あらいぐま】関数言語Haskell Part6【ハスケル】
0006デフォルトの名無しさん
2006/11/07(火) 22:58:22| ノ ,,. ,,ヽ
/ ● ● | 前スレ>996-1000全部もらったクマー
| ( _●_) ミ
彡、 ,、、|∪| ,,,ノ
/ . ヽノ ヽ
| _r'゚lニニニl]_ ____/l
fニニニニllニニ| \[ l===ニニl]}||||||||ll]}コl|====iニコ
|l_,,=-'''~ | \... ヽ'''ニ「_,,,l⌒l。__。_]三i三三iF
| 〈,,/ヽ___)|ll [`ー'
0007デフォルトの名無しさん
2006/11/07(火) 23:00:57∧_∧ ∧_∧ ))
(゙゙ヽ ゚∀゚)') ('(゚∀゚ /゙゙)
(( \ / ヽ /
((⌒) ( ) (⌒))
``ヽ_,) (,__,ノ゙
0008デフォルトの名無しさん
2006/11/07(火) 23:05:08(゚д゚ )
(| y |)
Haskellで勉強すればokと信じていたのに、
いつまでたっても頭がよくならない。
Haskell ( ゚д゚) ok
\/| y |\/
これらをくっつけて
( ゚д゚) haskellok
(\/\/
逆から読むとこれ臭ぁ、というわけだ
( ゚д゚) kolleksah
(\/\/
Haskellやってると、くさくなるということだな
(゚д゚ )
(| y |)
0009デフォルトの名無しさん
2006/11/07(火) 23:20:08□□□■□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□■□□■□□□
□□□■□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□■□□■□□□
□□□■□□□□■□□□□□□□□□■■■□□■□□□□□□□□□□■□□■□□□
□□□■□□□□■□□□□□□□□■□□□■□■□□□□□■■■□□■□□■□□□
□□□■■■■■■□□■■■□□□■□□□□□■□□■□■□□□■□■□□■□□□
□□□■□□□□■□■□□□■□□□■■■□□■□■□□■■■■■□■□□■□□□
□□□■□□□□■□■□□□■□□□□□□■□■■■□□■□□□□□■□□■□□□
□□□■□□□□■□■□□□■■□■□□□■□■□■□□■□□□■□■□□■□□□
□□□■□□□□■□□■■■□■□□■■■□□■□□■□□■■■□□■□□■□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
0010デフォルトの名無しさん
2006/11/07(火) 23:34:030011デフォルトの名無しさん
2006/11/07(火) 23:36:56○
ノ|)
_| ̄|○ 「L
○、
\、 ○
ヾ \)ヽ
_| ̄| <
0012デフォルトの名無しさん
2006/11/07(火) 23:39:07(( (`Д´) (`Д´)
(/ /) (/ /) ))
< ̄< < ̄<
帰ってこないやつがいる
(`Д´) (`Д´) ))
(( (\ \) (\ \)
> ̄> > ̄>
ハイ!! ハイ!! ハイ ハイ
. ( `Д)_(Д´ )
. ノ ノヽ | |>
/ > < ヽ
ハイッ!!
(`Д´)_(`Д´)ノ
ノ ノヽ | |
. ノ > < ヽ
ハイ!あるある探検隊!
(`Д´)ノ (`Д´)ノ
<| ヘ| <| ヘ|
< <
あるある探検隊!
ヽ(`Д´)ヽ(`Д´)
. |,、 |>. |,、 |>
> . >
0013デフォルトの名無しさん
2006/11/07(火) 23:43:04(`・ω・´) Haskellについて語るスレではござるのか?
.ノ^ yヽ、
ヽ,,ノ==l ノ
/ l |
"""~""""""~"""~""
0014デフォルトの名無しさん
2006/11/07(火) 23:44:18、ミ川川川川川彡,,
え!? ミ 彡
l⌒l____l⌒三 ク .ハ こ 三
∩___∩ / 三 マ ス こ 三
/ノ ヽ/ ● ● 三 l ケ は 三
| ● ● i' (_●_,,) U .三 ? ル .ひ 三
| (_●_) 彡 l U | 三 の ょ 三
ミ l U l u l ヽ,_,,ノ 三 ス っ 三
>ヽ,,ノ ゝ ,,,;:三 レ と 三
/ /'' c-、 ,,,;;::::三 し .三
(二つ / (  ̄ ̄彡 て 三
〉 ( ̄ ̄'') `--──彡 .ミ
/ 、 >-─'' '川川|l|l |l|川川ミ
0015デフォルトの名無しさん
2006/11/07(火) 23:45:05,. ´ ` ` 、
./ _ _ \
/ _  ̄ _ ヽ
/イィィ,,.,.,.,.,.,  ̄ ̄ !
f/ノノノノノノノ ヘ.__ j jノ__ノ
|/////// _ (__ ゚_>` __( ゚_イ
.!|.|i/_^ヽ|_'___r⌒ y' ヽ^)|
!|| fニ> :::::: `ー'゙ (_`___)ノ
ヽ.ニ` : /_ノ/川! / よし・・・・・
__ノ 、 / ヾ---'´ ノ
__ノ \l ` ____,/
\ ノ リ.|`ー--
\ .//
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
/ , , , , , , __ ___` 、
,//////ィ ヽ.
ノノノノノノノl /\ , -、 !
///////l ",二ヽ.二_ヽ. l lノ_へノ!
//////ノ (_jリ ゙T`’ノ / (rリ`y゙
ソ´,-、\| -` ー--‐ " __{ ー-'{
| ,f^ソ |____/ ゙̄ヾ"´ \^ヽ. |
| に( l j ,.. ヽ |.| 俺もハスケる!!
\` ' j `ー-‐' イ_ ` ノ'" i
゙‐-' /,. ‐-、/TTT|| ノ
_} / |----二ニフ ノ
人\ ヽ. ! r'二ヽ / /
_「 \\ ` 、 ` ̄ ̄/
\\ Ti"
\\ ノ | |\
0016デフォルトの名無しさん
2006/11/07(火) 23:46:26\/ ● 、_ `ヽ ======
/ \( ● ● |つ
| X_入__ノ ミ 関数言語なんかに釣られ、ク、クマ―――――!!
、 (_/ ノ /⌒l
/\___ノ゙_/ / =====
〈 __ノ ====
\ \_ \
\___) \ ====== (´⌒
\ ___ \__ (´⌒;;(´⌒;;
\___)___)(´;;⌒ (´⌒;; ズザザザ
(´⌒; (´⌒;;;
0017デフォルトの名無しさん
2006/11/07(火) 23:49:04------ 以上テンプレ -----
0018デフォルトの名無しさん
2006/11/08(水) 01:20:580019デフォルトの名無しさん
2006/11/08(水) 12:10:070020デフォルトの名無しさん
2006/11/08(水) 20:19:290021デフォルトの名無しさん
2006/11/11(土) 19:17:16あった方がいいんだろうか。
002221
2006/11/11(土) 19:22:16「いっこうにHaskellがはやらないのを鑑みるに」を頭に付け加えてくれ。
0023デフォルトの名無しさん
2006/11/11(土) 22:45:220024デフォルトの名無しさん
2006/11/11(土) 23:08:160025デフォルトの名無しさん
2006/11/12(日) 00:02:530026デフォルトの名無しさん
2006/11/12(日) 00:20:50自然言語で与えられるsemanticsではだめなのか?
それに、その用途に使うならHaskellで定義できないあらゆる関数(foreign importされたものとか)の
semanticsが必要になると思うんだが、それも要求しているの?
0027デフォルトの名無しさん
2006/11/12(日) 00:43:00実用的なスクリプト言語にsemanticsなど不要。
0028デフォルトの名無しさん
2006/11/12(日) 00:55:23http://d.hatena.ne.jp/sumii/20060928/1159403268
0029デフォルトの名無しさん
2006/11/12(日) 10:23:050030デフォルトの名無しさん
2006/11/12(日) 11:19:010031デフォルトの名無しさん
2006/11/12(日) 11:24:07形式的意味論もなにも、コンパイラとランタイムの
キャスト可否の判定が食い違ってるだけじゃん。
コンパイラ作成者がランタイムと違う実装してポカやっただけ。
本来なら A::compareTo(Object o) が呼ばれる。
ちょっとスレ違いですまん。
0032デフォルトの名無しさん
2006/11/12(日) 11:29:200033デフォルトの名無しさん
2006/11/12(日) 11:47:520034デフォルトの名無しさん
2006/11/12(日) 12:00:42違います。
そもそも理想って何ですか?
0035デフォルトの名無しさん
2006/11/12(日) 12:14:070036デフォルトの名無しさん
2006/11/12(日) 12:20:50だからどんなのが理想なんだよ。
何か目的があってこそ理想があるんだろ?
0037デフォルトの名無しさん
2006/11/12(日) 12:26:15手続き型言語と比べて数式(数学者の脳内)に近いだろ?
だから数学者にとって理想的な言語。俺はそれくらいの意味で書いた。
0038デフォルトの名無しさん
2006/11/12(日) 12:31:590039デフォルトの名無しさん
2006/11/12(日) 13:11:46十分に理想主義的だと思うが。
文字列がコードポイントの遅延リストであるのがその一例。
0040デフォルトの名無しさん
2006/11/12(日) 14:13:38マルチバイト文字をリストの1要素として扱えてる?
0041デフォルトの名無しさん
2006/11/12(日) 14:43:59Prelude> Char.ord maxBound
1114111
0042デフォルトの名無しさん
2006/11/12(日) 14:51:05main = print $ "テスト" !! 1
でもいいか。ソースはUTF-8で。
0043デフォルトの名無しさん
2006/11/12(日) 15:20:58d。内部はUTF-16(的)なのね。
しかし、どうせならUCS4まで扱ってくれれば良いのに。
あんな「思ってたより多かったのでサロゲート作っちゃいました」
とかほざく連中に合わせる必要ないのに・・・。
0044デフォルトの名無しさん
2006/11/12(日) 15:35:53いや、1114111は0x10ffffで、16ビットの範囲を超えていて、
Unicodeの17面を全部表現できる。
UTF-16よりUTF-32に近いはず。
0045デフォルトの名無しさん
2006/11/12(日) 15:50:10ISO(10646) すげーな、頑張れ。でも2byteで大丈夫か?
Unicodeコンソ 大丈夫大丈夫
それぞれ仕様を策定することになる。(コードポイントはお互い合わせてる)
Unicodeコンソ Unicode(未定義含めて全領域は0..0xFFFF)定義しますた。
Unicodeコンソ 実装は固定長2byte(Unicode,のちのUTF-16である)です。
ISO(10646) UCS定義(未定義含めて全領域は0..0x7FFFFFFF)しますた。
ISO(10646) 実装は可変長(UTF-8)と固定長4byte(UCS-4)です。
少しして
Unicodeコンソ (やっべ)
Unicodeコンソ 0xFFFFで足りませんですた。サロゲートペアで拡張しますね。
Unicodeコンソ UTF-16にサロゲートの仕様を追加しますた。
Unicodeコンソ それと固定長(4byte)のUTF-32用意しますた。4byteだけど0x10FFFF以上は使うなよ。
Unicodeコンソ おまけ つ[0x10FFFFまでのUTF-8]
Unicodeコンソ というわけでよろしく。
ISO(10646) 0x10FFFFまでコードポイントを追加しますた。実装は変わりません。
Unicode対応と言いつつ0xFFFFまでしか扱えないソフトが出てくる ← 今ここ
0046デフォルトの名無しさん
2006/11/12(日) 15:54:180047デフォルトの名無しさん
2006/11/12(日) 16:07:08確かにイメージ的には32の方が近いね。実際どういう実装なのかは知らないけど。
内部表現は100進数だったりして・・・。
0048デフォルトの名無しさん
2006/11/12(日) 18:34:50># p.269 kind の訳語は「類」なのか、「種」なのか?
>
> * ふつけるで使っている「類」は、nobsun の訳を元にしているんだろうけど……
> o 数学辞典を調べて、出てきた用語を使ったような
> + 「類」は "Class" じゃないの?
> * Clean では「種」
> * 型理論の方面では「種」が使われている
> * というわけで、以後は「種」を使うことにしましょう
このスレの住人の意見を聞きたいんだが、kindの訳語として「類」と「種」のどっちを使うべき?
0049デフォルトの名無しさん
2006/11/12(日) 18:59:42類は「似た性質/特徴を持つもの」(哺乳類,など)と個人的に思っている。
で、kindの "* -> *" と "*" の区別とかは
「似た特徴」とも言えるが、それ以上に「根源的な部分」を
表しているような気がするので「種」に1票。
属とか科とか似たのもあるけど気にしない。
0050デフォルトの名無しさん
2006/11/13(月) 00:13:440051デフォルトの名無しさん
2006/11/16(木) 20:28:17Haskellでオセロゲーム講座まだー?
0052デフォルトの名無しさん
2006/11/16(木) 21:02:53ふだんごついのに
数学者のかわいい一面ですね。
厳密さが快感だから悩むのでしょうか?
でも、悩むの楽しいのでしょうね^^
0053デフォルトの名無しさん
2006/11/16(木) 21:08:180054デフォルトの名無しさん
2006/11/18(土) 23:17:47i = 1
main = print $ myPlus i
myPlus :: a -> a
myplus j = j + j
これが動かないのはなんで?
0055デフォルトの名無しさん
2006/11/18(土) 23:34:020056デフォルトの名無しさん
2006/11/18(土) 23:37:19+ myPlus
0057デフォルトの名無しさん
2006/11/18(土) 23:38:49+ myPlus :: Num a => a -> a
005854
2006/11/19(日) 00:24:59レスサンクス。コンパイル通ったよ。
でもなにこの「Num a => 」って奴は。haskellは簡単なことが難しいって本当だな。
とりあえず調べてみる。ありがと。
0059デフォルトの名無しさん
2006/11/19(日) 03:00:010060デフォルトの名無しさん
2006/11/20(月) 07:04:540061デフォルトの名無しさん
2006/11/20(月) 20:44:20モナドはたくさんあるけど
0062デフォルトの名無しさん
2006/11/20(月) 21:03:220063デフォルトの名無しさん
2006/11/20(月) 21:08:38ネタを出してくれ
0064デフォルトの名無しさん
2006/11/20(月) 21:12:440065デフォルトの名無しさん
2006/11/20(月) 21:25:36http://homepages.inf.ed.ac.uk/wadler/topics/type-classes.html
http://haskell.readscheme.org/lang_sem.html
http://www.cse.unsw.edu.au/~chak/haskell/ghc/comm/
読み終えたら概要を報告すること.それが君の使命.
0066デフォルトの名無しさん
2006/11/20(月) 21:55:44GHCいれることにしたからWinHugsをアンインスコしようとした
そしたらダイアログでて以下のようなメッセージ
↓↓↓
=============================================================================================
C:\PROGRA~1\WinHugs\UNINST~1.EXE
C:\PROGRA~1\Symantec\S32EVNT1.DLL インストール可能なデバイスドライバはDLL初期化に失敗しました。
アプリケーションを終了するには[閉じる]を選んでください。
=============================================================================================
アンインスコ不可能になた
この前NIS2006を根こそぎ削除したのが原因のようなんだけど
こういう場合どうやったら引き続きアンインスコできんの?
0067デフォルトの名無しさん
2006/11/21(火) 00:20:350068デフォルトの名無しさん
2006/11/21(火) 00:25:44read "-123.456" :: Double
006966
2006/11/21(火) 01:19:160070デフォルトの名無しさん
2006/11/21(火) 05:43:13Symantecとか関係なくWinHugsはなぜかアンインストールできない。
なのでさくっとスクリプトを書いてみようと思ったらひどい目にあった。
なんでマルチバイト文字とCharの相互変換もできないんだよ…
ttp://up.uppple.com/src/up0496.txt
FFIを使う羽目になったので、GHCでコンパイルする必要がある。
あと無保証。BIOSが消し飛んでも関知しないから念のため。
0071デフォルトの名無しさん
2006/11/21(火) 07:09:34それを すてるなんて とんでもない!
0073デフォルトの名無しさん
2006/11/21(火) 23:20:19http://hackage.haskell.org/trac/hugs/ticket/42
認識はされてるけど対策はまだみたいだ。
0074デフォルトの名無しさん
2006/11/21(火) 23:27:38□□■□□□□□■□□□□□□□□□□□□□□■□□□□□□□□□■□□■□□
□□■□□□□□■□□□□□□□□□□□□□□■□□□□□□□□□■□□■□□
□□■□□□□□■□□□□□□□□□■■□□□■□□□□□□□□□■□□■□□
□□■□□□□□■□□□□□□□□■□□■□□■□□■□□■■□□■□□■□□
□□■■■■■■■□□■■■■□□■□□□□□■□■□□■□□■□■□□■□□
□□■□□□□□■□■□□□■□□□■■□□□■■□□□■■■■□■□□■□□
□□■□□□□□■□■□□□■□□□□□■□□■□■□□■□□□□■□□■□□
□□■□□□□□■□■□□□■■□■□□■□□■□□■□■□□■□■□□■□□
□□■□□□□□■□□■■■□■□□■■□□□■□□■□□■■□□■□□■□□
0075デフォルトの名無しさん
2006/11/23(木) 00:35:20ふつうのHaskellプログラミング買って勉強しはじめた
もう一冊のほうは知らんけど、これわかりやすくていいね
007675
2006/11/23(木) 00:35:50http://www.amazon.co.jp/gp/product/4797336021/sr=8-4/qid=1164209589/ref=sr_1_4/250-4437816-3500248?ie=UTF8&s=books
0077デフォルトの名無しさん
2006/11/23(木) 01:28:030078デフォルトの名無しさん
2006/11/23(木) 01:41:12スレがのびへんねん
0079デフォルトの名無しさん
2006/11/23(木) 10:51:460080デフォルトの名無しさん
2006/11/25(土) 02:20:39HaskellにDoxygenのようなドキュメント生成のためのツールなどはありますか?
0081しょしんしゃ
2006/11/25(土) 02:26:37質問です
GHCとHugsという存在がよくわかりません
Haskellが仕様で、GHCとかHugsが実装環境ってこと?
もしそうなら、仕様ってなに?
どっかにそれをタンマリ書いたPDFとか置いてるの?
『Haskell』ってのはただの説明書?
それともLinuxに例えるならHaskellがカーネルで
GHCやHugsがディストリビューション?
やべぇ、余計わかんなくなってきた
0082デフォルトの名無しさん
2006/11/25(土) 03:05:44Haddock
>>81
>Haskellが仕様で、GHCとかHugsが実装環境ってこと?
そんな感じ。
>どっかにそれをタンマリ書いたPDFとか置いてるの?
http://haskell.org/onlinereport/
http://www.sampou.org/haskell/report-revised-j/ (日本語訳)
0083デフォルトの名無しさん
2006/11/25(土) 03:09:04覗いてみたけど眩暈した
>>81のLinuxの例えはあってるかな?
あってるなら納得する
0084デフォルトの名無しさん
2006/11/25(土) 03:29:49GHCのような各処理系は、この定義に沿ってプログラムを解釈するように作られる。
言い替えると、Haskell ReportはHaskell処理系が満たすべき要件を定めている。
Linuxカーネルはディストリビューションが満たすべき要件を定めたりしないし、
カーネル自身がディストリビューションの一部なので、構造がだいぶ違う。
むしろ、POSIXとLinuxシステムの関係に近い。
0085デフォルトの名無しさん
2006/11/25(土) 22:50:340086デフォルトの名無しさん
2006/11/25(土) 23:04:56つーかC++言語だってgccだのMS VC++だのBCCだのいっぱいあって,それで普通じゃん...
HaskellもHugsだのGHCだのいっぱいあるのですぉ
0087デフォルトの名無しさん
2006/11/25(土) 23:31:43一般的なプログラマーならそれで理解できるだろうけど
Javaしか知らんのだよJavaしか!!1
0088デフォルトの名無しさん
2006/11/25(土) 23:36:490089デフォルトの名無しさん
2006/11/25(土) 23:38:200090デフォルトの名無しさん
2006/11/25(土) 23:48:33HTML <-> Haskell98
IE,FF,Opera,etc... <-> GHC, Hugs, etc...
0091デフォルトの名無しさん
2006/11/25(土) 23:55:59え、そんな単純なことなのか
0092デフォルトの名無しさん
2006/11/25(土) 23:57:290093デフォルトの名無しさん
2006/11/26(日) 01:21:32たとえば ghc でコンパイルして
C:\> .\fibonacci.exe 10
55
C:\> .\fibonacci.exe 20
6765
と動作するようなものを書く場合です。
またそれはどのあたりのマニュアルを参照すれば良いでしょうか。
0094デフォルトの名無しさん
2006/11/26(日) 01:25:00hoogleでarg辺りで検索すればgetArgsが出てくる。
0095デフォルトの名無しさん
2006/11/26(日) 01:28:37Haskell98なら
System.getArgs :: IO [String]
階層ライブラリなら
System.Environment.getArgs :: IO [String]
GHCに付属しているライブラリの大部分は
http://www.haskell.org/ghc/docs/latest/html/libraries/
にリファレンスがある。
0096デフォルトの名無しさん
2006/11/26(日) 01:37:36Javaの本ではそんなの読んだことない
0097デフォルトの名無しさん
2006/11/26(日) 01:54:37そんな大嘘が書いているのはどこですか?
Haskellではcharの配列とStringはまったく違います。
また、Javaではchar[] != Stringです。
0098デフォルトの名無しさん
2006/11/26(日) 02:12:41配列ではなくリスト、と言いたいんだよね?
0099デフォルトの名無しさん
2006/11/26(日) 02:21:040100デフォルトの名無しさん
2006/11/26(日) 02:24:30実は、Haskellでは文字列もリストなのです。文字列は文字のリストとして
表現されていて、特別な「文字列」は存在しません。
ですから、リストの処理を覚えれば文字列処理も身につけたことになります。
-----ふつうのHaskellプログラミング
0101デフォルトの名無しさん
2006/11/26(日) 02:24:56Haskellの文字列はCharのリスト(これを [Char] と書き表す)
Haskellでは配列とリストは別のデータ型.
関数型言語では大抵は配列よりリストのほうが頻繁に使われる.
0102デフォルトの名無しさん
2006/11/26(日) 02:28:12>>98がアホってこと?
0103デフォルトの名無しさん
2006/11/26(日) 03:57:26何故?
0104デフォルトの名無しさん
2006/11/26(日) 04:46:570105デフォルトの名無しさん
2006/11/26(日) 07:10:26次のコードは間違っていますか?それとも別の問題でしょうか?
import System.Posix.Files
main = getFileStatus "hoge" >>= (print . isDirectory)
ghciでは、ちゃんと動きました。
hugsで実行しようとすると、次のエラーが出ます。
*** glibc detected *** /usr/bin/hugs: free(): invalid pointer: 0x08f0d120 ***
======= Backtrace: =========
/lib/libc.so.6[0x4a74aefd]
/lib/libc.so.6(cfree+0x90)[0x4a74e550]
/usr/lib/hugs/packages/base/Foreign/Marshal/Alloc.so[0x4ed616]
/usr/bin/hugs[0x80771c6]
/usr/bin/hugs[0x8077bc0]
...
0106デフォルトの名無しさん
2006/11/26(日) 07:10:40つまりHaskellはもはやマイナーな分野ではない。
0107105
2006/11/26(日) 07:11:44ghcでコンパイルしようとすると、次のエラーが出ます。
t.o: In function `sHY_info':
(.text+0x8a): undefined reference to `unixzm1zi0_SystemziPosixziFiles_isDirectory_closure'
t.o: In function `sHW_info':
(.text+0x106): undefined reference to `unixzm1zi0_SystemziPosixziFiles_getFileStatus_closure'
t.o: In function `Main_main_srt':
(.rodata+0xc): undefined reference to `unixzm1zi0_SystemziPosixziFiles_isDirectory_closure'
t.o: In function `Main_main_srt':
(.rodata+0x10): undefined reference to `unixzm1zi0_SystemziPosixziFiles_getFileStatus_closure'
collect2: ld はステータス 1 で終了しました
OSはFedora Core 6
インストールしているパッケージは、
hugs98-2006.09-1.fc6
ghc66-6.6-1.fc6
ghc-6.6-1.fc6
です。
0108105
2006/11/26(日) 07:23:22次のコードが、hugsでは受け付けられるのに、ghci・ghcでは、
hoge.hs:3:10: parse error (possibly incorrect indentation)
などと、エラーになります。
haskellの言語仕様上、下記の記述は許されないということでしょうか?
main = do if True then putStrLn "t"
**********else putStrLn "f"
但し、半角スペースを記号"*"で置き換えています。
0109デフォルトの名無しさん
2006/11/26(日) 09:32:45仕様上正しいかどうかは知らんけど、もう一個スペース入れればghcで受け付けるようになる。
もしくは、この例ではdoは必要ないから外してしまうとghcでもOK。
ghcではdo構文の中ではthenとかelseはifの開始位置よりも右から始めないとダメって事になってるのかも。
0110デフォルトの名無しさん
2006/11/26(日) 09:43:25必要なライブラリをリンクさせてないってことでしょ。
単に ghc hoge.hs としたらhoge.hsだけをコンパイルして標準のライブラリとリンクさせて実行ファイル作るけど、
import System.Posix.Filesをしてるから標準のライブラリには含まれてないものを必要としてて、
それが足りないというエラーが起きてる。
-packge 〜 というオプションをつけて手動で必要なものを指示する方法もあるけど、
--makeオプションを使った方が必要なものを全部自動的に処理してくれるから楽。
ghc --make hoge.hs
0111105
2006/11/26(日) 11:37:13書き換えれば動くのは確かめたのですが、
処理系によって挙動が異なるので、仕様ではどうなっているのか気になっています。
>>110
ありがとうございます。
たしかに、ghcに--makeオプションを指定すると、うまくコンパイルできました。
hugsでは、このライブラリは利用できないのでしょうか?
hugsの実行時に+wオプションを使い、読み込まれるファイルを確認しました。
結果、メッセージは
...
Hugs session for:
...
/usr/lib/hugs/packages/base/System/Posix/Types.hs
/usr/lib/hugs/packages/base/System/Posix/Internals.hs
/usr/lib/hugs/packages/unix/System/Posix/Files.hs
hoge.hs
Type :? for help
Main> main
*** glibc detected *** hugs: free(): invalid pointer: 0x0965eb60 ***
======= Backtrace: =========
/lib/libc.so.6[0x4a74aefd]
/lib/libc.so.6(cfree+0x90)[0x4a74e550]
/usr/lib/hugs/packages/base/Foreign/Marshal/Alloc.so[0xd67616]
hugs[0x80771c6]
...
/lib/libc.so.6(__libc_start_main+0xdc)[0x4a6faf2c]
hugs[0x8049c51]
======= Memory map: ========
...4a8アボートしました
となり、異常終了してしまいます。
0112デフォルトの名無しさん
2006/11/26(日) 12:55:55特定のときにだけ実行するような場合は Monad (または Control.Monad) を
インポートして when か unless を使え。
あと和訳されてるんだし疑問を持ったら自分で仕様を読めば。
http://www.sampou.org/haskell/report-revised-j/exps.html
0113デフォルトの名無しさん
2006/11/26(日) 13:15:46仕様が気になるなら仕様書を読むしかない。
do構文が絡んだ場合のインデントについてまとめてあるのを見つけた。
http://en.wikibooks.org/wiki/Haskell/Indentation
0114デフォルトの名無しさん
2006/11/26(日) 13:16:47if..then..elseは単なる式であって、doの文にするなら一文に収めないといけない。
そのコードだとif...then...とelse...で二文に分かれているので、エラーになるのが正しいはず。
手元のHugs May 2006では
ERROR "test.hs":2 - Syntax error in expression (unexpected `;', possibly due to bad layout)
というエラーになった。
0115114
2006/11/26(日) 13:30:35Hugsのバグかも。
0116デフォルトの名無しさん
2006/11/26(日) 13:34:21明らかにライブラリまたはHugsの問題。コードは悪くない。
0118デフォルトの名無しさん
2006/11/26(日) 17:56:23に書かれている設定で Emacs の haskell-mode を入れてみたんですが、
インデントが正しくなりません。たとえば Yet Another Haskell Tutorial
の p.32 の例を入力すると、
module Main
where
import IO
main = do
hSetBuffering stdin LineBuffering
putStrLn "Please enter your name: "
name <- getLine
putStrLn ("Hello, " ++ name ++ ", how are you?")
となってしまいます。(半角スペース 2 つを全角空白文字に変換しています。)
何か設定がおかしいんでしょうか? それともこういうもの?
0119デフォルトの名無しさん
2006/11/26(日) 19:05:300121デフォルトの名無しさん
2006/11/26(日) 23:15:09それともみんな個人レベルで圏論とHaskellをやっているんですかね・・・
0123デフォルトの名無しさん
2006/11/27(月) 00:24:10いろんなところでやってるでしょ。代表的なのはオックスフォードだけど。
0124デフォルトの名無しさん
2006/11/27(月) 00:44:00orz
0125デフォルトの名無しさん
2006/11/27(月) 01:04:05ていうかこれ去年か。
0126デフォルトの名無しさん
2006/11/27(月) 01:07:320127デフォルトの名無しさん
2006/11/28(火) 17:33:230128デフォルトの名無しさん
2006/11/28(火) 18:48:090129デフォルトの名無しさん
2006/11/28(火) 20:13:560130デフォルトの名無しさん
2006/11/28(火) 20:20:060131デフォルトの名無しさん
2006/11/28(火) 23:56:32ttp://d.hatena.ne.jp/m-a-o/20061123#p2
0132デフォルトの名無しさん
2006/11/29(水) 00:01:57HelloWorldしか書けない初心者の俺がみても
10個中10個が失敗した理由になってねーよw
人気でない10の理由ってんなら少しはわかるが
0133デフォルトの名無しさん
2006/11/29(水) 00:07:45ttp://www.audioholics.com/news/editorials/10reasonsHDDVDsfailed.php
ttp://tabesugi.net/memo/cur/b2.html#192215
0134デフォルトの名無しさん
2006/11/29(水) 00:58:53> 残念!
> 「Hello worldさえブラックボックス」
> 斬り
古いネタだけど吹いたw
0135デフォルトの名無しさん
2006/11/29(水) 02:08:20ごめん全部読んだけど、面白くなかった。
何かお笑い芸人のネタみたい。
0136デフォルトの名無しさん
2006/11/29(水) 05:31:540137デフォルトの名無しさん
2006/11/29(水) 23:10:29遅延評価はパラダイム的にはものすごい進歩だとおもうけど。プログラム言語内に無限概念を取り込むことに成功している。
数学チックにいうと
遅延評価のない言語=代数的
遅延評価のある言語=超越的
とでもいうか・・・。
遅延評価は何気にHaskellの一番の利点だと思う。(パラダイム的に)
型推論なんて比べ物にならね。(比べるものではないが、ていうか比べられないけど)
0138デフォルトの名無しさん
2006/11/29(水) 23:16:310139デフォルトの名無しさん
2006/11/29(水) 23:25:33言語に組込みで持つには(計算機アーキテクチャから見て)複雑過ぎるし、
オーバーヘッドが大きすぎるし、空間効率の予測が難しすぎる。
たしかに遅延リストや遅延木は便利だけど、
それは言語に遅延評価を組み込む理由にはならない。
例えば遅延リストはOCamlやSchemeでも扱えるはず(違ってたらごめん)。
型推論とどっちを取るかといわれたら、俺なら間違いなく型推論をとる。
0140デフォルトの名無しさん
2006/11/29(水) 23:29:05専門用語きんし
↓以後ひらがな+説明文添付必須
0141デフォルトの名無しさん
2006/11/29(水) 23:29:54だけど、言語機能として一貫して遅延させるのと単に遅延評価を扱えるってのとでは話が違ってくる事柄なので、
そういった形での比較はナンセンスだと思う。
遅延評価は遅延評価なりのメリットがあるので別に要らない場面ではOCamlでもSchemeでも使ってりゃいいんでね?
0142デフォルトの名無しさん
2006/11/29(水) 23:31:390143デフォルトの名無しさん
2006/11/29(水) 23:37:50あー確かに議論が混乱してたかも。すまん。
>別に要らない場面ではOCamlでもSchemeでも使ってりゃいいんでね?
**が欲しいなら**言語を使え、というのは余計なお世話だ。
Haskellにあってその二言語にない特徴なんて遅延評価以外にもいくらでもあるわけで。
0144デフォルトの名無しさん
2006/11/29(水) 23:46:41すなわちHaskellは無限概念を内包しているのだ!
といってみる。
0145デフォルトの名無しさん
2006/11/29(水) 23:48:43よめないぞ
0146デフォルトの名無しさん
2006/11/29(水) 23:50:160147デフォルトの名無しさん
2006/11/29(水) 23:53:40なんで?
確かに
main = putStrLn "foo" >> main
みたいなのは書けなくなるけど、
main = putStrLn "foo" >>= (\_ -> main)
と書けばいいので問題ないと思うんだが。
0148デフォルトの名無しさん
2006/11/29(水) 23:54:42Haskellで書いてると、たまにC++を頼もしく感じます。
修行が足りない?
0149デフォルトの名無しさん
2006/11/29(水) 23:55:24例外モナドがMaybe aではなく() -> Maybe aだったとすると
do
foo
bar
を
do
(\_ -> foo)
(\_ -> bar)
って書かないといけなくなる。
0150デフォルトの名無しさん
2006/11/29(水) 23:56:06実装上の問題。正格では実装できない。おそらくね。
全然違うかもしれんが。
0151デフォルトの名無しさん
2006/11/30(木) 00:02:22それは気づかなかった。
その例だとdoを展開するときに>>でなく>>=を使うようにするだけで十分だけど、
類似の例がもっとあるといやだな。
>>150
newtype IO a = IO (() -> a)
で十分なはず。
C++でIOモナドを書いてみたら一応動いたのでたぶん問題ない。
0152デフォルトの名無しさん
2006/11/30(木) 00:03:44なぬ。馬鹿な。
0153デフォルトの名無しさん
2006/11/30(木) 00:04:05Haskellにとって遅延評価は基盤であり、その他の便利な特徴もそれを前提としているものが少なくない。
>>139の「それは言語に遅延評価を組み込む理由にはならない。」
というのがあるから嫌なら特に必要ない限り他の選択肢を選べばいいんでね?
という程度の考えだった。
逆に言えばHaskellの特徴の便利な部分をOCamlやSchemeでは実現しえないものか?
できないならやっぱHaskellの遅延評価とそのほかの特徴は切り離せないものと割り切るしかなかろう。
0154デフォルトの名無しさん
2006/11/30(木) 00:13:39遅延評価がないと難しそうなもの(where節とか)もあるけど
そうでもなさそうなもの(型クラスとか純粋さとかインデントによる構文とか)も結構あると思う。
0155デフォルトの名無しさん
2006/11/30(木) 00:33:51スーパーモ゛ナ゛ードッ!!
ヽ/\ , ,
| \ヾ // |, ,
ヾ //,,
\ ∧/|,//_ /"
ヾ ヾ,ヘヘ / ,/ /,
\ ヾ|/|/ヽノ/,/ /"
丶 (`∀´ ∨ /,
\ d つ /"
ヽ | | | /,,
\__,,,(_(__),,,_/"
0156デフォルトの名無しさん
2006/11/30(木) 00:53:460157デフォルトの名無しさん
2006/11/30(木) 01:17:54ttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3aLazyEvaluation
ここでnobson氏とShiro氏がSchemeで遅延評価にいろいろ挑戦しているみたいだけど
やっぱり完ぺきに実現するのは無理っぽいね
0158デフォルトの名無しさん
2006/11/30(木) 12:17:460159デフォルトの名無しさん
2006/11/30(木) 12:44:01BASIC でも無限ループが書ける。
0160デフォルトの名無しさん
2006/11/30(木) 16:54:46遅延リスト(無限リスト)とジェネレータ(ストリーム)は
本質的に異なる構造を持っているので、理論上代替は不可能。
実用上はだいたい代替できるんだけどね。
理論屋としては別物として考えておきたい。
0161デフォルトの名無しさん
2006/11/30(木) 19:02:290162デフォルトの名無しさん
2006/11/30(木) 21:41:56俺もだ。
だれかHaskellとC++とDとMerdとRubyとNemerleの良いとこ取りした言語
作ってくれないかな。
0163デフォルトの名無しさん
2006/11/30(木) 21:49:010164デフォルトの名無しさん
2006/11/30(木) 21:56:200165デフォルトの名無しさん
2006/11/30(木) 21:58:39C++3xはそれらを全て取り込んだ究極言語になるらしいよ。
0166デフォルトの名無しさん
2006/11/30(木) 22:08:55言語仕様が10巻本で出そうだな。
0167デフォルトの名無しさん
2006/12/01(金) 00:31:39>遅延評価はHaskellの一番の欠点だと思う。
遅延評価を実装することが、Haskellおよびその祖先のそもそもの目的だったのよ
遅延評価がHaskellの存在意義なの
0168デフォルトの名無しさん
2006/12/01(金) 01:31:50ラムダ計算や圏論とかモナドって考え方がさっぱりだ。
これって計算機科学や数学を勉強しなきゃならんね。
情報系の学部ってこんなんやってんの?
0169デフォルトの名無しさん
2006/12/01(金) 01:39:42プログラミングは計算機科学じゃないから。
0170デフォルトの名無しさん
2006/12/01(金) 01:40:530171デフォルトの名無しさん
2006/12/01(金) 11:05:07>ラムダ計算や圏論とか
haskell使うだけなら必要ない。
もしhaskellの入門本にラムダ計算や圏論が説明されていてもそこはすっとばしていい。
0172デフォルトの名無しさん
2006/12/01(金) 14:37:21すべてにおいて
エクセル>>>>>ハスケル
ハスケル厨は勘違いしないように。
名前自体パクりっぽいよな。
0173デフォルトの名無しさん
2006/12/01(金) 14:38:09そうすれば必要なところではHaskell、あとはC#ですむ。
0174デフォルトの名無しさん
2006/12/01(金) 19:38:410175デフォルトの名無しさん
2006/12/01(金) 22:55:47そうなのか?俺も初心者だけど
そこを理解してこそ、Haskellを勉強する価値があるんじゃないのか?
0176デフォルトの名無しさん
2006/12/01(金) 22:59:42やっぱり Haskell だよね。
0177デフォルトの名無しさん
2006/12/01(金) 23:20:53それは何のためにHaskellを勉強しているかに依るだろ。
俺は数学的背景をほとんど知らないけど、Haskellで
快適にコーディングができる程度には「使え」るし、
Haskellを勉強して得たものは非常に大きいと思う。
もちろん、背景を理解すると見えるものが一変する、という可能性は
否定できないけど。
0178デフォルトの名無しさん
2006/12/01(金) 23:23:52そのコードを自動でメモ化する処理系なんてあるのか?
さすがにそれを効率的だと言うのは誇張かと。
0179デフォルトの名無しさん
2006/12/02(土) 00:44:09なぜか3つもあるHaskell.NET
http://www.dotnetpowered.com/languages.aspx
0180デフォルトの名無しさん
2006/12/02(土) 13:56:21直接レジストリ消そうと思うんだけど、どれ消せばいいのかわからない
Software以外に関係してるとこあるのかな
0181デフォルトの名無しさん
2006/12/02(土) 14:32:53インストール時の選択によって違う。
詳しくは>>70のgetRegsを読んでくれ。
0182デフォルトの名無しさん
2006/12/02(土) 16:46:14HKEY_CURRENT_USER hKEY_CURRENT_USER Software\\Haskell
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\WinHugs
hKEY_CLASSES_ROOT hugs_haskell
hKEY_CLASSES_ROOT hugs_haskell
この4つ消してあとはフォルダごとゴミ箱つっこめばOKかな?
0183デフォルトの名無しさん
2006/12/02(土) 18:18:11>HKEY_LOCAL_MACHINE hKEY_LOCAL_MACHINE SOFTWARE\\Haskell
>HKEY_CURRENT_USER hKEY_CURRENT_USER Software\\Haskell
中身がhugsだけでないなら消すとまずい。
0184デフォルトの名無しさん
2006/12/02(土) 18:28:39GHCとかもその下に含まれてるね
その下のHugsってのだけ削除すればいいか
0185デフォルトの名無しさん
2006/12/02(土) 22:13:19逆にその辺の知識を勉強したいと思った場合どこから手を付ければいいんだろう?
高校レベルまでしか数学知識ない状態で。
0186デフォルトの名無しさん
2006/12/03(日) 08:22:320187デフォルトの名無しさん
2006/12/03(日) 21:24:57現実的に言って働いている社会人だとほとんど不可能だと思う。
理由としては。
1.時間が馬鹿みたいに必要。(日常生活に確実に侵食してくる)
2.難しいのでモチベーションが続かない。(理系は視野が狭いというが狭い視野じゃなきゃやってられねぇ。)
3.自己流だと確実に変な方向に行ってしまう(数学基礎論にはまってしまってその考えから抜け出せなくなってしまうのがよくあるオチ。数学は記号論理学じゃない。)
0188デフォルトの名無しさん
2006/12/03(日) 21:26:040189デフォルトの名無しさん
2006/12/03(日) 21:32:09貯金が溜まりますねー
0190171
2006/12/03(日) 23:13:30>>171は
>haskell使うだけなら
という限定つき。
たとえば、チューリングマシン知らなくてもC言語は使えるようになるし。
むしろ、基礎理論をうまく隠蔽できないなら、プログラミング言語の設計としては失敗といえるかも。
0191デフォルトの名無しさん
2006/12/03(日) 23:32:41> 3.自己流だと確実に変な方向に行ってしまう(数学基礎論にはまってしまってその考えから抜け出せなくなってしまうのがよくあるオチ。数学は記号論理学じゃない。)
そんな奴みたことない。
それに、この分野、まだまだみんな自己流じゃないの。
数学や物理のように確立されたカリキュラムもないし。
0192デフォルトの名無しさん
2006/12/04(月) 09:53:06そこからは自己流だがそこまで行くための基礎的な部分までの話。
基礎ができないと応用はできない。
0193デフォルトの名無しさん
2006/12/04(月) 15:20:35haskellソース→Cソース→アセンブラソース・・・
それとも直接アセンブラのソースに行くのでしょうか?
haskellソース→アセンブラソース・・・
0194デフォルトの名無しさん
2006/12/04(月) 16:12:18でも当然読めるようなCじゃない
0195デフォルトの名無しさん
2006/12/04(月) 16:15:200196デフォルトの名無しさん
2006/12/04(月) 16:32:041ヶ月でできるお勧めカリキュラム
1週目 λ計算。とりあえずD∞ modelあたりまでやる
2週目 型理論。ざざっとSystem Fまでやる
3週目 圏論。1,2週目の理解をもとにCCC modelまで。
4週目 記号論理学。LKLJNKNJの規則をながめる。
この後は興味に応じて論文を読み漁ればok
0197デフォルトの名無しさん
2006/12/04(月) 17:42:23こなすのが辛いような気がするんだが。
0198デフォルトの名無しさん
2006/12/04(月) 18:10:44でも、この辺の分野は親切な入門書もたくさんあるし、自己流の罠? にはまることもないと思う。
0199デフォルトの名無しさん
2006/12/04(月) 20:24:18つーか。196は社会人なめとんのかい。
社会人の場合、一日にかけられる勉強時間でせいぜい30分とか
1時間だぞ。その時間をとれないことも多い。
しかも環境も劣悪で電車の中とか、仕事で疲れた状態だとか、あんまり
頭に入るような状況ではない。
こういう話を聞くとまた、過酷な勤務の底辺DQNプログラマか、と思う奴も
いるだろうけど(DQNなのはあっているが)、社会人で9時6時で帰れるような
職場はありません。9時ぐらいまでで帰れる職場でも同じで、それは一般的
には楽な職場と言われている。
しかもカリキュラムがいきなりλ計算。
高校卒業程度の数学力と言っているのにλ計算以前に勉強することが
あるだろうと小一時間...。つーか、記号論理学とかはλ計算以前に
やるべきだと思うがどうか。
むしろ独習の場合、自分のペースで学習が進んでかつ理解度を試される
ことがないので、解った気になって先に行ってしまうのがあらぬ
方向に進んでしまう気がするがどうか。早くカリキュラムを進める
理解力より、ゆっくり物になるまで粘る忍耐力の方が重要な気がするけど、どう。
0200デフォルトの名無しさん
2006/12/04(月) 20:47:03やってみます。お薦めの本を教えてください。洋書でもいいです。
0201デフォルトの名無しさん
2006/12/04(月) 21:14:180202デフォルトの名無しさん
2006/12/05(火) 01:18:01頼むぞホント
高卒でもわかるように説明できないようじゃ価値ねーからな
0203デフォルトの名無しさん
2006/12/05(火) 01:31:58おい、何レス使うつもりだ
0204デフォルトの名無しさん
2006/12/05(火) 02:50:07有り難う。
んじゃ、Cで関数書いて呼び出したり
アセンブラで書いた関数をCで呼び出して
その関数をさらにhaskellで呼び出すことも可能なのでしょうか?
0205デフォルトの名無しさん
2006/12/05(火) 04:12:04もちろんできる。
そもそもForeign Function InterfaceというのがHaskell98の追補にあって、
たぶん全ての実装で利用できる。
http://www.cse.unsw.edu.au/~chak/haskell/ffi/
0206デフォルトの名無しさん
2006/12/05(火) 04:35:51なぜ誰もOSを書こうとしないの?
アセンブラとCが使えるならOS作れそうな気が
するのだけれど。
0207デフォルトの名無しさん
2006/12/05(火) 04:52:36http://programatica.cs.pdx.edu/House/
>House is a demo of software written in Haskell, running in a standalone environment.
0208デフォルトの名無しさん
2006/12/05(火) 14:54:220209デフォルトの名無しさん
2006/12/05(火) 21:13:270210187
2006/12/06(水) 11:24:57>つーか、記号論理学とかはλ計算以前に
>やるべきだと思うがどうか。
やるとしてもかなり初歩の部分だけでいいと思う∀、∃、とかの意味をちゃんと「理解して使える」ようになればいいと思う。
あんまり込み入ったところは使わないしおそらく必要性もないと思う。
というかかなりごちゃごちゃしていてやる気がしないはず。(俺はしなかった)
>むしろ独習の場合、自分のペースで学習が進んでかつ理解度を試される
>ことがないので、解った気になって先に行ってしまうのがあらぬ
>方向に進んでしまう気がするがどうか。早くカリキュラムを進める
>理解力より、ゆっくり物になるまで粘る忍耐力の方が重要な気がするけど、どう。
理解度を試されるというところもそうなのだけれど、根本的に数学を理解するということを勘違いしていることが多い(勘違いしていました。)
数学は語学です。
おそらくもっともいい方法は圏論勉強会に一回だけでも出てしまうのがいいと思う。(ちなみに俺は行った事ない)
なんとなく方向性はつかめるんじゃないかと勝手に思う。
0211デフォルトの名無しさん
2006/12/06(水) 18:31:09察するに、あなたは「自己流」でなんとかなったんじゃないの?
0212199
2006/12/06(水) 20:00:59> というかかなりごちゃごちゃしていてやる気がしないはず。(俺はしなかった)
こういうところで手を抜くと、後々しょうもないところで限界がくる
というか、学習に広がりがなくなると思うのでやった方がいいと思うけど
どうなんでしょう。それこそ独学の罠なんじゃないんでしょうか。
計算機科学の勉強は何も関数型言語だけじゃなく、論理学がつかわれている
データベース、公理的意味論、モデル検査などなど色々面白そうな
トピックスがあるのでこれらを楽しめないのは損...だと思うんだけど。
当然、関数型言語の勉強をするにも論理学はあった方がいいと思うんだけど。
0213デフォルトの名無しさん
2006/12/06(水) 20:07:340214デフォルトの名無しさん
2006/12/06(水) 20:27:500215デフォルトの名無しさん
2006/12/06(水) 20:33:56ここはム板で、Haskellでプログラミングすることに関するスレだ。
関係ない話は情報学板・数学板でやれ
0216デフォルトの名無しさん
2006/12/06(水) 20:46:310217デフォルトの名無しさん
2006/12/06(水) 21:41:410218デフォルトの名無しさん
2006/12/06(水) 21:45:300219デフォルトの名無しさん
2006/12/06(水) 21:46:14┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │○│●│ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │●│○│ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
0220デフォルトの名無しさん
2006/12/06(水) 22:03:09┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │○│●│ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │●│○│ λ│ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
0221デフォルトの名無しさん
2006/12/06(水) 22:04:34そんなに固いこといわなくても。
理論よりの話題が多いのは、そっちに興味のある住人が多いからだろう。
そもそも過疎スレで、Haskellでのプログラミングについてだって
盛り上がっているとはいえない(いったいHaskellでコード書いてる奴が
どれくらいいるのか)んだから、無理に話題をしぼってもいいことはないと思う。
もちろん、興味のない議論が長々と続くのは不愉快だと思うが、
その時は自分でネタを出すくらいの勢いで。
0222デフォルトの名無しさん
2006/12/06(水) 22:05:34┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │○│●│ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │λ│λ│λ│λ│ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
0223デフォルトの名無しさん
2006/12/06(水) 22:06:36┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ &│ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │○│●│ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │λ│λ│λ│λ│ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
0224デフォルトの名無しさん
2006/12/06(水) 22:07:36┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │&│ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │&│●│ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │λ│&│λ│λ│ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │&│ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
0225デフォルトの名無しさん
2006/12/06(水) 22:11:40┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │&│ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │&│●│ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │λ│●│λ│λ│ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │●│&│ │ │ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
0226デフォルトの名無しさん
2006/12/06(水) 22:14:48┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │&│ │ │ │ │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │&│&│ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │λ│●│λ│&│ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │●│&│ │ │&│ │λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │ │ │ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
0227デフォルトの名無しさん
2006/12/06(水) 22:19:46┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │ │ │ │ │ │ │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │●│ │ │ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │●│ │ │ │ │λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │●│&│ │ │ │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │ │λ│●│λ│&│ │ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │ │●│&│ │ │&│λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │ │ │ │ │ │ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │ │ │ │ │ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃ λ...
┗━━━━━━━━━━━━━━━━━┛
0228デフォルトの名無しさん
2006/12/06(水) 22:24:15┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │ │ λ... λ... λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ λ... λ... λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ λ... λ... λ... λ... λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ λ... λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ λ... λ λ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─λ...
λ... λ...λ... λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │ │ λ... λ... λ...
┃├─┼─┼─┼─┼─┼─┼─┼λ... λ...
┃│ λ... λ... λ...
┃└─┴─┴─┴─┴─┴─┴─λ... λ...
┗━━━━━━━━━━━━━━━━━┛
0229デフォルトの名無しさん
2006/12/06(水) 22:25:07鮫って魚が交尾するから鮫って書くんだぜ
0230デフォルトの名無しさん
2006/12/06(水) 22:25:11結局はλってこったな
0231デフォルトの名無しさん
2006/12/06(水) 22:27:48┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │∃│∃│ │ │ │ │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │●│∃│ │ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│∀│ │ │●│ │∀│ │ │λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │∀│ │●│&│ │ │ │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │∀│λ│●│λ│&│ │ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │ │●│&│ │ │&│λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ ∀ λ...
┃│∃│ │ │ │∀│ │ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │ │∃│ │∃│ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃ λ...
┗━━━━━━━━━━━━━━━━━┛
0232デフォルトの名無しさん
2006/12/06(水) 22:30:32┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│ │ │∃│∃│ │ │ │ │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │ │ │∨│∃│ │ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│∀│ │ │⇒│ │∀│ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│ │∀│ │∨│&│ │ │ │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │∀│∧│∀│∧│&│ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │ │⇒│&│ │ │&│ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│∃│ │ │ │∀│ │ │ │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│ │ │∃│ │∃│ │ │ │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃ λ...
┗━━━━━━━━━━━━━━━━━┛
0233デフォルトの名無しさん
2006/12/06(水) 22:40:210234デフォルトの名無しさん
2006/12/06(水) 22:56:57文章書いてる、または、データ入力の仕事している気分で全く面白くない。
0235デフォルトの名無しさん
2006/12/06(水) 23:20:40鬱陶しくなってhappyに戻った。
0236デフォルトの名無しさん
2006/12/08(金) 00:37:39ならなかった。それ気づいたときなんか毎日泣いた。
だからなんか粘着気味にレスしてる。
>>212
記号論理学は(偏見かもしれないが)直感が効かない。
数学でも直感てすごく大事。
あれはほぼ超絶テクニックのアルゴリズムの塊だから
やっても面白くないと思う。
最初から直感の聞かない数学の分野やっちゃうと
それが数学だと思っちゃう。まぁそれも確かに数学
なんだがあれは自分の人生をそれにすべて費や
しているような人がやるもんだ。
たとえば、基礎論とかゼータ関連ね。
煽りとかじゃなく>>212はブルバキって知ってるか?
0237デフォルトの名無しさん
2006/12/08(金) 00:57:14まぁ要するに>>212が必要としている論理学のレベルは
ほかの分野の数学やっていれば自然に身につく。多分。
だったらほかの直感の効くわかりやすい分野から始めた
方がいいんじゃないかと。
あえて記号論理学みたいな諦める可能性90%なやつから
始める必要なんてなかろう。必要性が出てきたときに勉強
すればいいんじゃないかと。
0238デフォルトの名無しさん
2006/12/08(金) 01:11:18いい加減ウザい
0239デフォルトの名無しさん
2006/12/08(金) 01:16:56圏論理解するのにどんくらいかかる?
高卒で数IIもわからんし、基本情報処理もさっぱり
0240デフォルトの名無しさん
2006/12/08(金) 01:22:19どんな分野も一生理解出来るようにはならんよ。
0241デフォルトの名無しさん
2006/12/08(金) 01:25:49くっだらねーレスしてる暇あったら馬鹿にでもわかるような説明考えろよ
0242デフォルトの名無しさん
2006/12/08(金) 02:02:34日本に圏論を理解してると自覚している人が誰もいないのに?
0243デフォルトの名無しさん
2006/12/08(金) 02:03:19人に依るとしか言えない。取りあえず入門の第一歩
http://d.hatena.ne.jp/m-hiyama/20060821/1156120185
を読んでどう思ったか教えてくれ。
0244199
2006/12/08(金) 04:14:43本当に何も知らない人なんじゃないかと思われているような。
たぶん、想像しているレベルの論理学のイメージはそんなに
変わらないはずだよ。
自分もそんなにディープな論理学の知識はいらんと思うが
(それはやぶ蛇)、自然に覚えるのでなく、それ用の入門書
ぐらい嫁というスタンスなんだが。俺もそれ以上はやってない。
> あえて記号論理学みたいな諦める可能性90%なやつから
どこまでやって諦める可能性90%というのか知らないけど。
言われてみればそんなに簡単ではないのは確かにそうだな。
0245デフォルトの名無しさん
2006/12/08(金) 04:41:44記号論理学より入りやすいんじゃないかな。
プログラム言語だし。
わかってみれば浅い話でも、
いきなりシーケント計算とかみると投げ出すでしょフツー
0246デフォルトの名無しさん
2006/12/08(金) 11:29:00>本当に何も知らない人なんじゃないかと思われているような。
名前だけじゃなくてその集団の目指したこととその失敗のことを
言っているんじゃないか。
0247デフォルトの名無しさん
2006/12/08(金) 18:32:550248デフォルトの名無しさん
2006/12/08(金) 20:30:210249デフォルトの名無しさん
2006/12/08(金) 21:02:59そうなの?
圏論勉強会は?
0250デフォルトの名無しさん
2006/12/09(土) 00:12:51ってamazon(us)で批評されてたけど、
実際、Haskellプログラミングや関連論文読む力付ける目的に合ってるの?
結構長いし、ちょっと不安す
0251デフォルトの名無しさん
2006/12/09(土) 00:52:06でも、いまつづいてる連載ってfmapを結構頻繁に使ってない?
0252デフォルトの名無しさん
2006/12/09(土) 01:30:37俺も conceptual mathematics をざっと読んだけど出てくるのは product, sum, exponetial まで。
でも具体例でじっくり書いてあるので足元を固めて自力をつけるのにはよいかもしれない。
理解してたつもりでも実際練習問題解くとむずかしいものも多い。
取りあえず浅く知って(真に理解したという意味ではないよ)早く先に進みたいという人には向かない。
0253252
2006/12/09(土) 01:50:51equalizer も確かでてきてた。
「自力をつける」は「地力をつける」だった。
0254デフォルトの名無しさん
2006/12/09(土) 03:02:44ほとんど説明無い。ほとんど有向グラフの図ばっかり。
あの図だけ見て何が何をやっているのか理解している人いるの?
0256デフォルトの名無しさん
2006/12/09(土) 12:29:51なんでわざわざ洋書にこだわるんだ。
0257デフォルトの名無しさん
2006/12/09(土) 12:32:390258デフォルトの名無しさん
2006/12/09(土) 13:36:44もうこの話し止めほうがいい気がしてきた。
0259デフォルトの名無しさん
2006/12/09(土) 13:37:350260デフォルトの名無しさん
2006/12/09(土) 13:45:07これ以降圏論の話は数学板か情報学板でするように。
0261デフォルトの名無しさん
2006/12/09(土) 15:00:13けんのん?
0262デフォルトの名無しさん
2006/12/09(土) 19:57:47いや。ファンクタだけは理解しておいたほうが良いんだよ。
fmapがちゃんとつかえるのと使えないのとでは結構違いがある。
liftMも同じく。
0263デフォルトの名無しさん
2006/12/09(土) 20:03:31圏論を理解していなくても使える。
0264デフォルトの名無しさん
2006/12/09(土) 20:12:140265デフォルトの名無しさん
2006/12/09(土) 20:20:000266デフォルトの名無しさん
2006/12/09(土) 20:41:36ふおん
0267デフォルトの名無しさん
2006/12/09(土) 20:53:03使い方を間違えるって言うのはおかしかったな、すまん。
0268デフォルトの名無しさん
2006/12/09(土) 21:06:54使ってますって人ってどれくらいいるもんなんかな?
連載では多用しているけど。
0269デフォルトの名無しさん
2006/12/09(土) 21:09:28読みづらい書き方になる、ってことか。
どっちにしても例が欲しい。
>>268
fmapは使わないけどliftMは日常的に使う。
0270デフォルトの名無しさん
2006/12/09(土) 21:20:16`fmap`,`liftM`みたいに中間演算子的に使われると
どういう意図でそれをつかっているのか意味がとれない。
あとは、できるだけ
たとえば
calc :: a -> a
という関数があったらIOモナド用に
calcIO :: IO a -> IO a
calcIO = fmap calc
みたいに使ってもらったほうが構造だけは同一で元となっている
カテゴリーだけが違うということが明確になっていいんじゃないかと
思っている。
うーん。うまく伝わっただろうか・・・。
というかあまりいい方法じゃないのかなとか思ってきた・・・。
0271デフォルトの名無しさん
2006/12/09(土) 21:29:28やってしまって後はカテゴリーごとにfmapするなりliftさせるなり
したほうが再利用できるようになるし。
sample :: a -> IO a
なKleisli射はなるべく作らない方向性でいくべきなんじゃないかって。
モジュール化も損なわれるんじゃないかと。
でもそこまでいってしまうと作れなくなってしまうというジレンマに陥って
しまうから・・・。どうなんだろうねぇ。。
0272デフォルトの名無しさん
2006/12/09(土) 21:47:36レスありがとう。
>`fmap`,`liftM`みたいに中間演算子的に使われると
>どういう意図でそれをつかっているのか意味がとれない。
これは俺も時々やるんだが、気持ち悪いと感じるのはたぶん分かった。
圏論の観点からはfmapは(射に作用する)単項演算であって
二引数関数のように使うのは不自然だ、ということか。(素人なので間違ってたら教えてくれ)
このスタイルを弁護しておくと、Haskellではあらゆる場合について
(g f) x
と
f `g` x
が等しいので、後者を見た読者は前者を見たのと同じように理解することが期待されている。
だから、両者を単純に字面上のおさまりに基づいて使い分けることができる、という考え方が
あり得ると思う。例えば f x の代わりに f `id` xと書くのがそんなに変だろうか。
加えて、それを言い出すと(>>=)だって圏論的には一引数の演算なんじゃないか、とか。
calcの例は理解できなかった。せっかく説明してもらったのにすまん。
0273デフォルトの名無しさん
2006/12/09(土) 22:01:34それは例えば標準入力からCSV形式のデータを読みたいときに、
getCSV :: IO [String]
のようなものをgetChar/getLine/getContentsを使って書くよりも、
parseCSV :: String -> [String]
を用意してユーザ側でfmap parseCSV getContentsとさせた方が良い、
という理解でおk?
それなら多くのHaskellユーザが経験的にやってることだと思うんだが。
0274デフォルトの名無しさん
2006/12/09(土) 22:19:06>圏論の観点からはfmapは(射に作用する)単項演算であって
>二引数関数のように使うのは不自然だ、ということか。(素人なので間違ってたら教えてくれ)
その通り。というかそう自分としては解釈している、というほうが適切かな。
人によっては他の翻訳もありうると思う。
>このスタイルを弁護しておくと...
そういうスタイルがあることは最近知った。
前スレで出てきたLaw and Order in Algorithmicsってpdf内が
そういう流儀だったしおかしくはない。
でも、個人的に同一カテゴリー内の射(a -> a, IO a -> IO a)
なら「有り」だとは思うけど、fmapとliftMの場合そうやっちゃうと
ファンクタとかリフトって概念を持ち出す意味がなくなる。
>加えて、それを言い出すと(>>=)だって圏論的には一引数の演算なんじゃないか、とか。
圏論的には(>>=)は概念的にfmap,liftMの持つ概念と別種。
(といいつつそこらへんはよくわかっていないからどうともいえない
というのが本音。別種であるのは確か)
0275デフォルトの名無しさん
2006/12/09(土) 22:23:20>圏論の観点からはfmapは(射に作用する)単項演算であって
ということなんだけどちょっと例が少なかったか。
(というか勝手な見解だからあんまり惑わされないでくれ)
というわけでもっと例をあげると
calcMaybe :: Maybe a -> Maybe a
calcMaybe = fmap calc
calcList :: [a] -> [a]
calcList = fmap calc
calcF :: F a -> F a
calcF = fmap calc Fは任意のFunctorクラス。
みたいなかんじに使えないかと。
・・・でも、やっぱり適用できる場面はそんなに無いか・・・な。
>>273
そういうこと。そしてそれがファンクタの概念。
経験的にわかっていることならこの際明確にしてしまおう。
0276デフォルトの名無しさん
2006/12/09(土) 22:25:37これはすべて個人的な勝手な解釈だ。
0277デフォルトの名無しさん
2006/12/09(土) 22:41:300278デフォルトの名無しさん
2006/12/09(土) 23:04:44>みたいなかんじに使えないかと。
つまり、IOならIOについて(fmap calc)をひとかたまりとみなすべきであり、
そういうスタイルを奨励するためにcalcIOという名前を付ける、ということか。逆に
do x <- a; b (calc x)
のようにcalcの適用をdo式中に散逸させたりすると、
この構造がわかりにくくなるので良くない、と。
ただ、相変わらずこのように書くことの現実的利益がわからない。
>構造だけは同一で元となっている
>カテゴリーだけが違うということが明確になっていいんじゃないかと
>思っている。
の部分。
>経験的にわかっていることならこの際明確にしてしまおう。
もちろん明確にするのは価値があると思うし、そういうのは
個人的に好きな方向性だけど、もともとの議論に関して
「圏論を知らないとHaskellを使うのにどれくらい支障があるか」という点については、
はっきりさせておきたかった。俺としてはHaskelll(のような言語)が
真に一般に普及してほしいと思っているので、経験だけではカバーできない
重大な困難があるかどうかが気になった。
0279デフォルトの名無しさん
2006/12/09(土) 23:52:51>つまり、IOならIOについて(fmap calc)をひとかたまりとみなすべきであり、
>そういうスタイルを奨励するためにcalcIOという名前を付ける、ということか。
いや、そこまで強くは言っていない。名前付けたのはわかりやすくするためで
>>273みたいな名前付けない使い方が一般的だと思う。
というか経験的にすでにわかってることなんだと思う。
>ただ、相変わらずこのように書くことの現実的利益がわからない。
考えを整理できるとかそういう部類で現実的利益といわれると無いね・・・。
>「圏論を知らないとHaskellを使うのにどれくらい支障があるか」という点については、
>はっきりさせておきたかった。俺としてはHaskelll(のような言語)が
>真に一般に普及してほしいと思っているので、経験だけではカバーできない
>重大な困難があるかどうかが気になった。
Haskell使用するというレベルでは圏論の知識の有無による
困難は表面的には無い。が根源的には結構困難があると思う。
おそらく人のコードを読むという段階であらわに出てくるハズ。
fmapにしたってファンクタの概念をつかって圏論チックな考え方で
使おう思っている人と、そうじゃない人だと使い方が違う。
そういうのが積み重なって人によってはその書き方の意図が
読めないコードというのが出てくると思う。
そういう意味では結構困難がある。
まぁ要するにコーディングスタイルの問題。
圏論的なものを取り入れたHaskellコーディングスタイルを確立する
のかあくまで経験的なコーディングスタイルを確立するのか。
うーむ。なんだかグダグだになってしまった。
とりあえずfmap,liftMは便利じゃね?ということを
最初は説明したかったんだがものすごく言葉足らずでスマン。
0280デフォルトの名無しさん
2006/12/10(日) 00:39:38「現実的利益」なんて嫌らしい言い方をしたが、ようするに
「それで何がうれしいのか」を聞きたかっただけだった。
「考えを整理できる」というので十分。
>考えを整理できるとかそういう部類で現実的利益といわれると無いね・・・。
圏論的な考え方を身につけた人にとって考えを整理しやすい書き方、ということでいいだろうか。
>Haskell使用するというレベルでは圏論の知識の有無による
>困難は表面的には無い。が根源的には結構困難があると思う。
>おそらく人のコードを読むという段階であらわに出てくるハズ。
いいたいことはたぶん分かった。もちろん実感として分かるわけじゃないので
自信を持って理解したとはいえないが。
俺としては、「表面上」支障がなければそれで十分だと思う。
例えばライブラリを提供する/使うだけならスタイルの不一致は問題にならないし。
しかし冷静に考えると、表面上支障がないというのは誰に聞くまでもなく俺が
身を持って知っていることだった。これじゃ何が聞きたかったのか分からん。
結局聞きたかったのは「圏論ってそんなにすごいの?」だったような。
ぐだぐだ
>とりあえずfmap,liftMは便利じゃね?ということを
>最初は説明したかったんだがものすごく言葉足らずでスマン。
とんでもない。言葉の通じない相手に長々付き合ってくれたことに感謝。
0282デフォルトの名無しさん
2006/12/10(日) 01:33:40は後置演算子と考えればOK。
つまり
(f `fmap`) a
。
0283デフォルトの名無しさん
2006/12/10(日) 11:18:22>圏論的な考え方を身につけた人にとって考えを整理しやすい書き方、ということでいいだろうか。
まぁせっかく勉強したんだから使っていこうじゃんという気持ちも大きい。
>俺としては、「表面上」支障がなければそれで十分だと思う。
>例えばライブラリを提供する/使うだけならスタイルの不一致は問題にならないし。
その通りだと思う。ただ圏論の概念の名前を冠した射(ファンクタ、リフトetc..)は
(個人的に)理解して欲しい。
ちゃんとそういう名前がついているわけだし。
>結局聞きたかったのは「圏論ってそんなにすごいの?」だったような。
実際的な利益はほとんど無いんじゃないかと思う。
一般的抽象のナンセンスといわれるようにすごくないと感じる人も
いて全然おかしくない。個人的な価値観の問題なのかな。
ただ、モナドに関する情報の中でどれが有意義な議論なのか
見分けることができるようにはなった。
あと、うまくいえないがしっくりとする。
なんかしっくりとこないなぁというひとはちょっとやってみると
いいんじゃなかろうか。
0284デフォルトの名無しさん
2006/12/10(日) 14:48:03スマン寝ぼけて無視してた。
Functorクラスでfmapの定義
fmap id = id
fmap (f . g) = fmap f . fmap g
とあるけどこれはまんま圏A、B間のファンクタFの定義
F( id_A ) = id_B
F( f_A ・ g_A ) = f_B・g_B
と同じ。
ただ、厄介なことにfmapがファンクタというわけではない
(ファンクタを構成するarrow functionというものにあたる)
arrow functionこと射関数っていうのは関数を圏の異なる関数に
移す関数。(関数というと語弊があるから「作用」というべきか)
うむ。そうだfmapは関数ではない。「関数」に作用する「作用素」と
見るべきだから中間演算子として使うのはダメ。
というのではどうですか。
0285デフォルトの名無しさん
2006/12/10(日) 14:59:31まぁfunctionって意味が広いんだよ。
それを全部functionという単語の元
素朴な関数概念で置き換えちゃうから・・・。
うーん。自分でいっててよくわからん。
真偽は自分で考えてくれ。
0286デフォルトの名無しさん
2006/12/10(日) 16:36:520287デフォルトの名無しさん
2006/12/10(日) 17:02:27まぁグダグダだしね
0288デフォルトの名無しさん
2006/12/11(月) 13:01:480289デフォルトの名無しさん
2006/12/11(月) 16:39:02HaskellのFunctorと、C++のファンクタって、何か関係がありますか?
C++のファンクタは、単なる呼び出し可能のオブジェクトなのですが。
0290デフォルトの名無しさん
2006/12/11(月) 16:44:04http://itpro.nikkeibp.co.jp/article/COLUMN/20061005/249933/
この連載を少しずつ読んでいるのですが、
fmapがあればmapは要らないような気がします。なぜmapが残っているのでしょ
うか?
0291デフォルトの名無しさん
2006/12/11(月) 18:13:45どちらも語源がfunctionである、という以上の繋がりはないと思う。
0292デフォルトの名無しさん
2006/12/11(月) 20:02:35289じゃないけど便乗。
0293デフォルトの名無しさん
2006/12/11(月) 20:27:22OCamlのファンクター、カンケネー♪
0294デフォルトの名無しさん
2006/12/11(月) 21:10:57ベースにした概念という意味では関係がある。
C++のファンクタはまた違う語源のものなので関係ないという話をどこかで読んだことがある。
0295289
2006/12/11(月) 21:16:52C++とは関係ないのですね。しきりに首をひねっておりました。
0296デフォルトの名無しさん
2006/12/11(月) 23:01:06words関数やlines関数の実装で、リストのリストを返す方法がわかりません。
"hello world" を引数に取って["hello","world"]と返す関数はどのように実装したらいいでしょうか
0297デフォルトの名無しさん
2006/12/11(月) 23:03:54f _ = []
0298デフォルトの名無しさん
2006/12/11(月) 23:13:34ttp://www.jmuk.org/d/?path=2005/08/22#d22t03
0299デフォルトの名無しさん
2006/12/12(火) 09:22:19http://www.sampou.org/haskell/report-revised-j/standard-prelude.html#$vlines
0300デフォルトの名無しさん
2006/12/12(火) 12:25:470301デフォルトの名無しさん
2006/12/12(火) 17:03:37互換性のために残ってるのだと思う。
単相性制限があるから、単純にmapをfmapに置き換えることは出来ない。
0302289
2006/12/12(火) 17:25:36おお!向井さんの所でまとまっていたとは!
>>300
いや、私には難しいので、読むのにすごく時間がかかります。
だけど、入門Haskellのモナドまでを読めば、何とか理解できる範囲だと思います。
圏論の全く分からない私にはありがたい連載です。
何より、とても面白いと思います。
>>301
やはり過去互換性ですか。単相性制限?が分かりませんが、だからfmapという
新しい名前を作る必要があったのですね。
0303デフォルトの名無しさん
2006/12/14(木) 11:38:37Visual Haskellをインストールしようとしたところ、
WindowsHostScriptで「Failed to setup vs_haskell.dll」というエラーが出たのですが、
これを解決する方法はありませんか?
よろしくお願いします。
0304デフォルトの名無しさん
2006/12/15(金) 02:29:080305デフォルトの名無しさん
2006/12/15(金) 07:20:19解決しました。
0306デフォルトの名無しさん
2006/12/15(金) 10:53:23自作自演乙
0307デフォルトの名無しさん
2006/12/15(金) 22:38:25map関数がわからん
使うだけなら簡単なんだけど、型の宣言がつじつま合わないというか
とにかく納得できない
ふつうのHaskellプログラミングみながら勉強してんだけど
ここで3〜4日停滞してる
square n = n * n
map :: (a -> b) -> [a] -> [b]
map square [1, 2, 3]
この場合の「map関数」の宣言、最初の「a」が「square関数」を指しているのか?
@(a -> b)の部分で「square 1」「square 2」「square 3」と計算して
A???
0308デフォルトの名無しさん
2006/12/15(金) 22:51:17a->bはaを受け取ってbを返す関数の型。
mapは「aを受け取ってbを返す関数」とaのリストを受け取って、bのリストを返す関数。
a->bにあたるのはsquareだけだよ。
0309デフォルトの名無しさん
2006/12/15(金) 23:00:55map :: (a -> b) -> ( [a] -> [b] )
(map square) [1, 2, 3]
ってこと(文法も知らんが)?
0310307
2006/12/15(金) 23:53:33ソウイウコトカ!!!
スッキリー、スッキリ-
0311デフォルトの名無しさん
2006/12/15(金) 23:56:33そうそう。haskellの多変数関数は関数を値とする一変数関数。
文法もそれでもあってるはず。
0312デフォルトの名無しさん
2006/12/16(土) 13:01:080313デフォルトの名無しさん
2006/12/16(土) 16:38:02-O2無しでcompileされるようにMakefileinが書かれているけど
C compilerの最適化の副作用を避けるため等のなにか理由がある?
0314デフォルトの名無しさん
2006/12/16(土) 23:10:46変数がレジスタに乗ってしまってメモリ上から消えると、
GCを前提とした言語処理系では問題になることがあるみたいだが。
0315デフォルトの名無しさん
2006/12/17(日) 09:47:59それはない。
しかし、レジスタ上だろうがメモリ上だろうが、変数が元の値ではなく
加工された値でしか存在しないという状況はあり得て問題になる。
0316デフォルトの名無しさん
2006/12/17(日) 16:10:40ある特定の処理系の組み合わせで問題が起きることはあるかもしれないが、
常に問題が起きるってことはない。ソースコードが間違えていないなら、ね。
ソースコードは間違えているけど「ある処理系では問題が起きない」てのは
よくある話。
-O2の付け忘れでなければ、まずいコードになっているのかも?
0317デフォルトの名無しさん
2006/12/17(日) 21:48:390318デフォルトの名無しさん
2006/12/17(日) 22:17:14役に立つ。というか必要なところにvolatileがないのはダメだろ。
スレ違いなんでこのへんで
0319デフォルトの名無しさん
2006/12/18(月) 23:32:54だれかHaskellの再帰について教えて
くわしく、わかりやすく、ていねいに
0320デフォルトの名無しさん
2006/12/18(月) 23:53:40aaa a = aaa (a+1)
0321デフォルトの名無しさん
2006/12/19(火) 00:01:57空 = 色
色 = 空
in Data.Set.singleton 空
0322デフォルトの名無しさん
2006/12/19(火) 00:07:22わからん
おまえの説明はまったくわからん大滝 秀治)
0323デフォルトの名無しさん
2006/12/19(火) 01:01:500324デフォルトの名無しさん
2006/12/19(火) 01:16:38スマンがねる
良レスに期待
0325デフォルトの名無しさん
2006/12/19(火) 09:06:05というか、再帰のプログラムが書けるのなら、なおさら何が疑問なのかがわからん。
http://www.shiro.dreamhost.com/scheme/docs/tailcall-j.html
とかでどうだ。Haskellじゃないけど。
0326デフォルトの名無しさん
2006/12/19(火) 16:44:17とりあえず、再帰を身体にしみこませる必要があると思うんだ。
Little Schemer
http://www.amazon.co.jp/exec/obidos/ASIN/0262560992
Scheme手習い(上記の本の邦訳。入手困難)
http://www.fukkan.com/fk/VoteDetail?no=6462
Haskellはそのあとでも十分。
0327デフォルトの名無しさん
2006/12/19(火) 17:07:270328デフォルトの名無しさん
2006/12/19(火) 17:16:330329デフォルトの名無しさん
2006/12/19(火) 17:42:59hoge n 0 = n
hoge n c = hoge (n + 1) (c - 1)
hoge2 0 = 0
hoge2 c = 1 + hoge2 (c - 1)
hogeは末尾再帰だと思うのだが、hoge2も最後にhoge2があるから末尾再帰なのだろうか。
それとも、1 + hoge2が最後の処理だから末尾再帰じゃない、っていう解釈をするのかな?
0330デフォルトの名無しさん
2006/12/19(火) 17:49:280331329
2006/12/19(火) 19:13:04ありがとう。
それにしてもレスが速いな(・∀・;)
ついでだから実行速度を測ってみた。
最適化しないとhogeの方が若干速いが、-Oをつけると同じ速さになる。
なんか切ないな
0332デフォルトの名無しさん
2006/12/19(火) 19:32:06Haskell では末尾再帰について特に大きなメリットはない。
普通は末尾再帰は逐次計算していけるのから嬉しいのだが、
Haskell は最外簡約を取るので、逐次計算は行われない。
0333デフォルトの名無しさん
2006/12/19(火) 19:48:33>Haskell では末尾再帰について特に大きなメリットはない。
そんなことはないと思うが。
Haskellは常に最外簡約というわけではないし
(GHCは正格性解析の結果に基づいて簡約順序を決める)、
最外簡約の場合でも、クロージャを作って別の関数に渡す代わりに
直接呼んでしまえるのでコストが小さい。
0334デフォルトの名無しさん
2006/12/20(水) 01:39:23推論規則の演習とかやった記憶もかすかにあるんだが。
圏論とかサパーリ。
もとが哲学寄りの文学屋なので、そっち方面の記号論は、まぁわかるんだが。
そんな俺様にお勧めのHaskell文献があったら教えてください。
0335デフォルトの名無しさん
2006/12/20(水) 01:54:260336デフォルトの名無しさん
2006/12/20(水) 01:55:040337334
2006/12/20(水) 02:01:53ごめん。言語解説書ではなくて、背景の理論のほう。
とりあえず俺の勉強したなけなしの記号論理学が
どこをどう通ったらHaskellになるのか見てみたい。
0338デフォルトの名無しさん
2006/12/20(水) 02:06:18まず、歴史的にはMLの方が先だから、MLから入ってみたら?
0339デフォルトの名無しさん
2006/12/20(水) 05:01:09PierceのTAPLでも嫁
それが理解できなければどうせその先も理解できない
0340デフォルトの名無しさん
2006/12/20(水) 06:22:58いつかみんながHASKELLを使う世の中がきたらいいな。
0341デフォルトの名無しさん
2006/12/20(水) 07:31:12Haskellerで元Lisperの方ってどれくらいいるんでしょうか?
元Lisperの方でHaskellに移ってきた方は、Haskellのどのあたりに惹かれました?
0342デフォルトの名無しさん
2006/12/20(水) 08:04:58Haskellはまだ大半が素人みたいなので鞍替えした。
0343デフォルトの名無しさん
2006/12/20(水) 11:15:15Haskellを知っている人ならほぼ確実にLispも知ってるよ。
0344デフォルトの名無しさん
2006/12/20(水) 11:25:490345デフォルトの名無しさん
2006/12/20(水) 11:30:540346デフォルトの名無しさん
2006/12/20(水) 11:54:300347デフォルトの名無しさん
2006/12/20(水) 14:37:22Haskel は全く知らんけど、その記号論理学とはあまり関係無いんじゃないか?
Lisper 以外の大半人たちは高階の理論を記述する際に階によって用語を使い分ける。
ので集合とか射とか群とか圏とかいろんな言葉が出てくるわけだけど、
やってることはλと(暗黙の)括弧が多いか少ないか程度の違いのような気がするので、
そう大上段に構えるほどの物じゃないような・・・
0348デフォルトの名無しさん
2006/12/20(水) 14:40:390349デフォルトの名無しさん
2006/12/21(木) 00:41:189割が両刀
1割は悪い人にだまされて最初の言語がHaskellというケース
0350デフォルトの名無しさん
2006/12/21(木) 01:14:50Haskellだけでも十分おもしろいけど。
0351デフォルトの名無しさん
2006/12/21(木) 01:17:52C++からLispを経由せずにHaskellをやりだした者ですが、
私をだました悪い人はどこですか?
0352デフォルトの名無しさん
2006/12/21(木) 01:41:26Haskellも勉強してるよ
オブジェクト指向しか知らない世代なわけだけど
そこに固まらないうちに関数型も慣れときたいなぁと思って
0353デフォルトの名無しさん
2006/12/21(木) 01:58:04勉強するように言われました。
0354デフォルトの名無しさん
2006/12/21(木) 01:59:43関数型言語習い始めだと、副作用なしというプログラミングスタイルは辛いと思う。
まずは副作用ありの関数型言語で慣れておくと良いと思う。
0355デフォルトの名無しさん
2006/12/21(木) 02:50:42議論することじゃないが、俺はそうは思わない、という意見だけ表明しておく。
0356ド素人
2006/12/21(木) 02:53:37盛り上がってるとこ悪いんだけどくだらない質問
精製されたexeファイルをGHC入れてない人に実行させるにはどうすりゃいいの?
main = print $ map square [2, 5, 3, 1, 10]
square n = n * n
たとえば↑みたいなプログラムをexeにしたって実行できないよね?
どういうのならできるんだ???
0357デフォルトの名無しさん
2006/12/21(木) 02:54:35逆にLispのほうが優れてると思うところは?
0358デフォルトの名無しさん
2006/12/21(木) 06:27:28問題なく実行できる。
exeファイルをダブルクリックしたけど一瞬だけコマンドプロンプトが開いてすぐに閉じたから実行できなかったと思ったんじゃないの?
それだったらgetCharでも付けて入力待ちさせりゃいい。
main = do { print $ map square [2, 5, 3, 1, 10]; getChar }
square n = n * n
0359デフォルトの名無しさん
2006/12/22(金) 00:46:51main = do cs getContents
putStr cs
exeファイルにしてコマンドプロンプトで下のように実行しようとしてもできない
ghc out.hs -o out
out 引数(文字列)
なんで?
ふつうのHaskellプログラミングには
実行するには Ctrl - Z + Enter って書いてるけど、これどういう意味?
0360デフォルトの名無しさん
2006/12/22(金) 01:04:25そのぷろぐらむだと引数は関係ない。
outを実行すると入力待ちになるから、適当な文字列を何行かタイプする。
入力を終了したくなったら、まず、カーソルが行頭にある状態で
Ctrlとzを同時押しして(^Zという表示が現れるはず)、
つぎにEnterキーを押せば良い。
0361デフォルトの名無しさん
2006/12/22(金) 08:44:55Haskell の優れてるところ: 型システムによる安心感、純粋関数型なところ
Lisp の優れてるところ: マルチパラダイムなところ、あんま理屈とか考えずに言語を気軽にカスタマイズできるところ
0362デフォルトの名無しさん
2006/12/25(月) 11:44:14使い方次第
0363デフォルトの名無しさん
2006/12/25(月) 18:05:58日本語でおk
0364デフォルトの名無しさん
2006/12/25(月) 20:14:12Haskellの優れているところ:遅延評価、モナド
0365デフォルトの名無しさん
2006/12/25(月) 22:18:130366デフォルトの名無しさん
2006/12/25(月) 23:05:140367デフォルトの名無しさん
2006/12/25(月) 23:19:58優れているかは別として、Haskellでいちばん好きな機能かも。
0368デフォルトの名無しさん
2006/12/25(月) 23:59:33ここはもうビチョビチョじゃねーか
0369デフォルトの名無しさん
2006/12/26(火) 00:21:36doは>>=を使うよりも見栄え良く書けるが、
代入型言語の特徴を残す記法なので、
不満に思う人も多いと思う。
0370デフォルトの名無しさん
2006/12/26(火) 00:54:35似たような意見をwebで時々見掛けるが、よく理解できない。
命令的プログラミングをしたいとき、それに適した構文を
使えるのだから、単純に良いことのように思える。
それとも、命令的プログラミングをサポートしない言語の方が
良いという考えなんだろうか。
0371デフォルトの名無しさん
2006/12/26(火) 01:29:44「関数」で統一された世界を作れば、何か良いことがあるに違いない
(古風な言い方である自動プログラミング、とか、構造の視覚化がしやすくなる、とか、etc..)
と思う人が多いからじゃないかな?
0372デフォルトの名無しさん
2006/12/26(火) 01:31:33http://hp.vector.co.jp/authors/VA000092/jokes/strup.html
0373デフォルトの名無しさん
2006/12/26(火) 02:48:410374デフォルトの名無しさん
2006/12/26(火) 14:22:410375デフォルトの名無しさん
2006/12/26(火) 22:44:220376デフォルトの名無しさん
2006/12/27(水) 00:03:09a <- hoge;
hoge2 a;
hoge3 a
}
と
hoge >>=
\a ->
hoge2 a >>
hoge3 a
どっちがみやすいですか?
0377352
2006/12/27(水) 01:44:38この記事おもしろいねw
真実だとしても、結局のところ今はPCの性能の上昇とか
言語自体の進化によってオブジェクト指向は機能的で合理的な言語になってるよね?
たしかに、
「あるプロジェクトのコードを再利用した話なんて聞いたことない」とか、
「正しく継承させるためには設計だけでCの3倍もの時間かかる」とか、
超笑えるねw
当たり前に思ってきた(教えられてきた)コトって、
そのまま信じちゃうからこういう記事読むとオラ、ワクワクしてきたぞ
0378デフォルトの名無しさん
2006/12/27(水) 02:04:040379デフォルトの名無しさん
2006/12/27(水) 02:05:25あの内容はあながち冗談に思えなくて泣けてきた。
彼がinterviewであんなこと言うはずは無いだろうけどさ
0380デフォルトの名無しさん
2006/12/27(水) 02:32:15チャッチャと書けるようになったらダイブ頭よくなってるかな?
0381デフォルトの名無しさん
2006/12/27(水) 03:01:210382デフォルトの名無しさん
2006/12/27(水) 03:12:31もっとHaskeりたいんだけど、やさしく教えてくれるかわいいコいないかな
0383デフォルトの名無しさん
2006/12/27(水) 03:14:55禁句だ。
0384デフォルトの名無しさん
2006/12/27(水) 22:11:40Haskellを教えてくれるギャルを探すんだよ
0385デフォルトの名無しさん
2006/12/27(水) 22:47:06| |
| |
∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´Д`)// < ⊥が返ると思います!
/ / \
/ /| /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
__| | .| |
\  ̄ ̄ ̄ ̄ ̄ ̄ ̄\
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
0386デフォルトの名無しさん
2006/12/30(土) 22:17:23少なくともVBやJavaやってるよりは確実にイケテルよね?
モナドとかラムダとか遅延評価について語るだけでモテモテな世の中になればいいのに。
0387デフォルトの名無しさん
2006/12/30(土) 22:50:41俺もそう思う。
思いたい。
0388デフォルトの名無しさん
2006/12/30(土) 23:04:43普段は泥臭いPerl使ってる俺は死んだらいい。
0389デフォルトの名無しさん
2006/12/30(土) 23:06:560390デフォルトの名無しさん
2006/12/30(土) 23:47:59■オサレ言語
Haskell、Clear、その他の純粋関数型言語
■普通の言語
C、C++、C#、アセンブラ、PHP、Perl、awk
■キモい・胡散臭い
Ruby(特にRails界隈)、Ajax、XML、Paython、その他Web2.0に絡む言語すべて
■オッサン専用
COBOL、FORTRAN、PASCAL
■厨言語
Java、VB、BASIC、HSP
0391デフォルトの名無しさん
2006/12/31(日) 00:07:220392デフォルトの名無しさん
2006/12/31(日) 01:02:19■オサレ言語
Haskell、Concurrent Clean、その他の純粋関数型言語
■普通の言語
C++、C#、Java、VB.NET
■泥臭い
Perl
■ハッカー専用
C、アセンブラ、awk、Python
■キモい・胡散臭い
PHP、Ruby
■オッサン専用・過去の遺物
COBOL、FORTRAN、PASCAL
■厨言語
VB、BASIC、HSP、Delphi
■宗教
Lisp、その他Lisp系統
0393デフォルトの名無しさん
2006/12/31(日) 01:06:400394デフォルトの名無しさん
2006/12/31(日) 01:49:490395デフォルトの名無しさん
2006/12/31(日) 09:30:38C で言う != みたいな記号ってないん?
環境は WinHugs 使ってる。
0396デフォルトの名無しさん
2006/12/31(日) 10:37:39HSPは胡散臭い言語だと思います。
0397デフォルトの名無しさん
2006/12/31(日) 10:43:32(!=) :: Eq a => a -> a -> Bool
(!=) = (/=)
0398デフォルトの名無しさん
2006/12/31(日) 13:12:31あと perl はなにげにハッカー言語だと思う
0399デフォルトの名無しさん
2006/12/31(日) 13:25:47ハッカーが「つくっている」≠ ハッカー言語
0400デフォルトの名無しさん
2006/12/31(日) 13:35:02そう言う意味で C やアセンブラは納得できるけど Python はどうかなぁ
0401デフォルトの名無しさん
2006/12/31(日) 16:51:27http://www.sauria.com/~twl/conferences/pycon2005/20050325/Python%20at%20Google.html
0402デフォルトの名無しさん
2006/12/31(日) 19:23:05main = putStrLn "こんにちは!"ってやるとエラーになるんですけれど・・・
あきらめるしかないんでしょうか?
0403デフォルトの名無しさん
2006/12/31(日) 22:24:01ありがとう
0404デフォルトの名無しさん
2007/01/01(月) 10:53:25putStrLn とかはまだ未対応みたいね。
0405デフォルトの名無しさん
2007/01/01(月) 13:46:12Hugsだと動く。
0406デフォルトの名無しさん
2007/01/01(月) 23:29:560407デフォルトの名無しさん
2007/01/01(月) 23:41:17EUC環境なら普通にできるよ。
0408402
2007/01/02(火) 00:02:38>>405
ネイティブなバイナリを作りたいんです。
>>406
標準入力から入力した文字を処理させたいんです。
出来るでしょうか?
>>407
windowsマシンしか持ってないんです・・・
0409デフォルトの名無しさん
2007/01/02(火) 00:23:32ただのバイト列としての扱いになるけど一応読み込めて表示できる。
0410デフォルトの名無しさん
2007/01/02(火) 14:03:50逆。プログラムには埋め込めるけど入出力ができない。
>>408
http://yogimo.sakura.ne.jp/ssc/index_ja.html
外部ライブラリだけど、とりあえず日本語の入出力はできる。
0411デフォルトの名無しさん
2007/01/02(火) 16:04:51GHC6.4ではEUCだったらソースコード中に書いてもコンパイル可能。
putStrなどで出力するとEUCのまま出力される。
そのため、WindowsではEUC→ShiftJIS変換を掛けた後putStrしないとうまく表示できなかった。
GHC6.6ではソースコードの文字コードがUTF-8になったため、
UTF-8形式でなら日本語の文字列をソースコードに記述できるようになった。
しかし、putStrなどのIOの基本部分はまだきちんとUTF-8対応してないため、
UTF-8形式の文字列をそのまま出力させることができない。
ただ、6.4のときと同じようにUTF-8→ShiftJIS変換して出力させるのなら表示できる。
410が紹介しているライブラリはそう言った処理を行ってくれる。
0412デフォルトの名無しさん
2007/01/02(火) 17:48:11間違ってるところがあったら指摘してほしい。
Haskell98によると、Charは一つのUnicode文字を表す(6.1.2)。
これに従って、比較的新しいHugsやGHC(6.4系を含む)ではCharは32ビット整数になっている。
ただし、どちらも入出力に際しての変換が完全でない。具体的には、
・ソースコード中の文字列リテラル
・System.IOライブラリでの入出力
が問題になる。
1. GHC6.4.2以前
ソースコード・入出力ともLatin-1を仮定する。Latin-1ではバイト値と
コードポイントが一致するので、入力時には外部エンコードの各バイトがそのままCharに
入り、出力時にはCharの下位8ビットのみが出力されるような実装になっている。
このため、あるエンコーディング(Latin-1とは限らない)の入力をgetLineで受け取り、
それをそのままputStrで表示すれば、入力時とおなじエンコードにおいて正しく表示される。
これを利用して、[Char]を、本来のコードポイントの列としてではなく、特定のエンコードの下での
バイト列として使うことができる。ただし文字列リテラルについては、GHCはLatin-1として
不正な文字を受け付けないので、EUC-JPのような例外を除くと、単純にリテラルを使うことはできない。
2. GHC6.6
ソースコードにはUTF-8、入出力にはLatin-1を仮定する。このため、EUC-JPでリテラルを直に
書くことはできない。
(続く)
0413デフォルトの名無しさん
2007/01/02(火) 17:49:243.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux)
ソースコード・入出力ともロケールのエンコードを利用する。
4.最近のHugs(Windows)
ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。
5.最近のHugs(それ以外)
未調査。
・結局どうするか。
規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。
i. CharをUnicodeとして扱う
(3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは
明示的なエスケープ(たとえば"\22234")が必要。
ii. Charをバイトとして扱う
(3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4)
を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。
lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。
0414デフォルトの名無しさん
2007/01/03(水) 00:32:02ttp://d.hatena.ne.jp/ha-tan/20070102/1167722751
このあたりも。
0415デフォルトの名無しさん
2007/01/03(水) 01:24:370416デフォルトの名無しさん
2007/01/03(水) 02:49:120417デフォルトの名無しさん
2007/01/03(水) 10:33:09問題はむしろSystem.IOを書き直すのが(重要度の割には)面倒だ、というところに
あるんじゃないかと。
0418デフォルトの名無しさん
2007/01/03(水) 11:02:511関数とアクションは何が違うのでしょうか?
2square n = n*n
というのはnを引数とする関数を定義しているんですよね。
cみたいにn = n*nという代入を表しているんじゃないですよね?(説明が難しい)
0419デフォルトの名無しさん
2007/01/03(水) 12:00:081. アクションとはIO aを返す関数のことです
2. まずは、squareの型を見てみましょう。
square :: Num a => a -> a
ということですから、代入ではありません。
0420デフォルトの名無しさん
2007/01/03(水) 12:00:500421デフォルトの名無しさん
2007/01/03(水) 12:09:36main 関数の返す値が最終的に実行される。
Perl や JavaScript で、プログラムを内部的に文字列として生成して、
最後に eval で実行するような状況に少し似てる。
2. 関数 square n と n*n とが等値であることを定義しているだけ。
数学では = ってのは左辺と右辺が等しいことを表すよね。
x + 2y = 4 とか、f(x) = 2x + 1 とか。あれと同じ。
0422デフォルトの名無しさん
2007/01/03(水) 12:13:31>アクションとはIO aを返す関数のことです
アクション(動作)はIO a型の値のことじゃないか?
たとえばputStrは文字列を取って動作を返す関数。
putStr "Hello"は動作。
0423デフォルトの名無しさん
2007/01/03(水) 12:48:55プログラミング指向の論文を読んでいると、
引数または返値に"IO a"を含むものをfunctionとは呼ばずにactionと呼んでいる事が多いので、
そう書いたんだよ。
0424デフォルトの名無しさん
2007/01/03(水) 12:50:080425デフォルトの名無しさん
2007/01/03(水) 13:05:45代入ではないんですね。
どうも混乱してしまって・・・
cでいう
# include <stdio.h>
int main (void)
{
int y = 0;
y = sqare(3);
printf("%d\n",y);
}
int sqare (int n)
{
n = n*n;
return n;
}
のn = n*n;とは別なんですよね?
0426デフォルトの名無しさん
2007/01/03(水) 13:10:07IOっていうのが味噌なんですね。
それとcのプログラム、関数宣言してないですけど、許してください。
0427デフォルトの名無しさん
2007/01/03(水) 13:41:21意味的には似てるけど、
たとえば、Cではsquare(2)とすれば、それがその場で実行されて4という値として扱われるけど、
Haskellでは(square 2)そのものとして扱います。
まず、IO a -> a という事はできません(IOがいったんくっついたら取り外すことはできないの)ので、
Haskellではmainを評価することで実行されますが、
最終的にはmainまで … -> IO aというのを続けて書いていかないとダメなの。
main関数の型は main :: IO () ですよね。
0428デフォルトの名無しさん
2007/01/03(水) 13:42:50square n = n * n
に近い書き方は、
int square(int n) { return n*n; }
だね。
逆に、
int sqare (int n) { n = n*n; return n; }
に近いのは
square n
= let m = n * n
in m
0429デフォルトの名無しさん
2007/01/03(水) 22:39:29main = do func 1
これ ghc だと通ったんですけど、この場合の func の型は何ですか?
0430デフォルトの名無しさん
2007/01/03(水) 23:54:510431デフォルトの名無しさん
2007/01/04(木) 00:50:26よく参照されるやさしい Haskell 入門ですら、
関数自身の事を表す事もあれば、値を表す事もあるんだよな。
http://www.sampou.org/haskell/tutorial-j/io.html
例えば、7.1 の最初の文
>各 I/O のアクションはそれぞれ値を返します
は関数自身をアクションと呼んでるように見えるし、
その直後の
>これはアクションを他の値と区別するためです
は値をアクションと呼んでるように見える。
どちらもアクションと呼ぶのか、それともいい加減なだけなのか。
どっちなんだろ?
>>425
square n が n * n と等値。
無意識に square と n の間に理解の区切りを設けてるみたいだけど、
そんなものはないと考えた方がいい。
0432425
2007/01/04(木) 16:24:19square n = n*nは理解できました!
関数squareは仮引数nを一つとる関数で、その本体はn*nという理解でよいんですね。
関数とアクションの違いは、まだ勉強不足で理解は出来ていないですけど、
IOが味噌なのは分かりました。
話は変わりますけど、文字列が文字のリストなんて、HaskellはCみたいですね。
0433デフォルトの名無しさん
2007/01/04(木) 18:40:300434デフォルトの名無しさん
2007/01/05(金) 14:06:19すいません、配列とリストって何が違うのでしょうか?
調べてみたんですが良く分かりませんでした。
例えば
# include <stdio.h>
int main (void)
{
char *string = { "Hello"};
printf("%c\n",string[2]);
return 0 ;
}
みたいにリストって言うのは、配列とポインタの組み合わせとその操作と思っていたんですけれど
違うのでしょうか?
0435デフォルトの名無しさん
2007/01/05(金) 14:27:300436デフォルトの名無しさん
2007/01/05(金) 15:04:12Haskellでいうリストは「単方向リンクリスト」のこと。
0437デフォルトの名無しさん
2007/01/05(金) 15:41:320438デフォルトの名無しさん
2007/01/05(金) 16:05:390439デフォルトの名無しさん
2007/01/05(金) 16:08:13実際のリストは、こんな感じのデータ構造を
適当につなぎ合わせて作られている。
struct Object {
enum {PAIR, INTEGER, STRING} type;
union {
struct {struct Object *head, *next;} pair;
int integer;
char *string;
} body;
};
0440デフォルトの名無しさん
2007/01/05(金) 16:09:53http://www.metabolome.jp/ja/biochem/bioinfo/list.pdf/view
0441デフォルトの名無しさん
2007/01/05(金) 16:21:40それは余りに違いすぎないか?
型タグはない実装が多いだろうし、その定義だと遅延しない。
0442デフォルトの名無しさん
2007/01/05(金) 16:24:430443デフォルトの名無しさん
2007/01/05(金) 16:39:23頭の中のモデルとしてはこれで十分。
っていうか、実装の話をしだしたらキリがないだろ
0444デフォルトの名無しさん
2007/01/05(金) 16:58:38わざわざ型タグを含めたObject型を持ち出しているから、実装に忠実な
データ構造を提示しているつもりかと思った。
>頭の中のモデルとしてはこれで十分。
遅延を考慮しないなら十分だろうが、そういう単純化した
モデルとしてなら無駄が多くないか?
struct node
{
void *head;
struct node *tail;
};
で十分だと思うが。
0445デフォルトの名無しさん
2007/01/05(金) 17:18:17文字列とかの "本物のデータ" が
どう収まるか説明しないと、
普通はイメージが湧かない思う。
まぁ、その判断は >>434 に任せるが・・・
0446デフォルトの名無しさん
2007/01/05(金) 17:28:410447デフォルトの名無しさん
2007/01/05(金) 17:47:170448デフォルトの名無しさん
2007/01/06(土) 14:36:31でも何でこれってあちこちIO付きなの?
0449デフォルトの名無しさん
2007/01/06(土) 18:59:17なぜData.Mapみたいなインタフェースじゃないか、という疑問なら、効率の問題。
Data.Mapのようなインタフェースだと、配列に操作(たとえばinsert)を施した後、
操作前の配列と操作後の配列の両方を操作しえるので、この二つを別々に
保持しておかないといけない。(ナイーブには毎回コピーをとればよい。
もっと低コストな方法もあるだろうが、いずれにせよオーバーヘッドがある)
実際Data.HashTableのようなIOの絡んだインタフェースなら、
常に最新版しか操作できないので、単純なメモリ上の破壊的操作で実装できる。
なぜSTじゃなくてIOなのかという疑問なら、俺にも判らん。
0450448
2007/01/06(土) 23:35:56ども。Haskell初学者なので処理系の中の人の気持ちはあまりわからんけど、
破壊的操作を用いて実装すれば実行時効率がよいことは理解できる。ありがとう。
STってのはControl.Monad.STのこと?
GHC付属文書での記述を軽く眺めてみたけど、さぱーりだった…
で、便乗して別の質問。Data.Map的なインタフェースを持つ型について。
その型の変数xがあって、内容を一部変更した値を変数yに格納して、
変数xの内容を完全に破棄したとき、「いつでも全体をコピーしたりはしない」
ことはわりと期待してもよいもの?
0451デフォルトの名無しさん
2007/01/07(日) 11:37:43感謝の言葉が遅くなってしまい申し訳ありません。
>>439,444
実際のコードの提示、有難うございます。
>>435,436,437,438,440,441,442,443,445,446,447
ご助言有難うございます。
リストの事はC言語による最新アルゴリズム辞典という本を買ってきて解決しました。
もうひとつ質問です。
文字のリストと文字列の事についてなのですが、
Haskellではこの二つは全く同じで
ある関数がstringを引数にとるなら文字列として扱われて、
[char]を引数にとるなら、文字のリストとして扱われる、
という理解でよいのでしょうか?(ふつうのHaskell、p68から質問です。)
0452デフォルトの名無しさん
2007/01/07(日) 11:38:11なんとか良いプログラミングスタイルないですか?
0453デフォルトの名無しさん
2007/01/07(日) 11:39:430454デフォルトの名無しさん
2007/01/07(日) 11:39:54中身では、
type String = [Char]
ということになってるのかな。
だから、Stringも[Char]も同じ。
0455デフォルトの名無しさん
2007/01/07(日) 11:45:58そういう場合って、SICPで勧めているプログラミングスタイルだと二度手間になってしまいますよね。
0456デフォルトの名無しさん
2007/01/07(日) 11:58:00unsafePerformIOでIOを外しちゃえばいい。
0457デフォルトの名無しさん
2007/01/07(日) 12:23:20最初から上位の関数にIOをつけておけば良い。
0458デフォルトの名無しさん
2007/01/07(日) 13:03:05たとえば、設定ファイルの読み込みとかの用途だとそれでも良いかもしれないが、
unsafePerformIOだと実行順序が規定されなくなってしまうでしょ?
>>457
すべての関数にIOをつけると、ものすごく再利用しにくくて汚いコードになると思うのですが・・
0459デフォルトの名無しさん
2007/01/07(日) 13:12:29全体として実行順序が規定されていなきゃいけない処理なら
IOが必要な部分だからそのままでいいのでは。
0460デフォルトの名無しさん
2007/01/07(日) 13:53:54ライブラリの関数や、部品としての再利用を目的とした関数なら、
将来にわたって入出力をしないと確信を持って言えることがおおいだろうから、
そういう場合にはIOなしで問題ない。
逆に、部品としての再利用性よりも変更に強いことが求められる部分
(アプリケーションのなかで比較的上位の(mainに近い)部分とか)は、たとえ現時点で入出力が
絡まないとしても、IOをつけておいて損はないと思う。
0461デフォルトの名無しさん
2007/01/07(日) 14:07:09>STってのはControl.Monad.STのこと?
そう。IOと同様にメモリ操作のできるモナドだけど、
IOと違って入出力には使えず、その代わりrunSTを使って外せる。
>ことはわりと期待してもよいもの?
なんともいえない。
たとえばtailはコピーを一切しないで実装されてる
(結果のリストと元のリストは完全に共有される)し、
Data.Map.insertの結果も大部分を元のmapと共有する。
一方で、initはリスト全体をコピーするし、Data.Array.Array
ではすべての変更操作ごとに配列全体がコピーされる。
(効率のために、なるべくたくさんの操作を一回にまとめて適用できるようになっているけど)
0462デフォルトの名無しさん
2007/01/07(日) 14:42:41モナドより使いやすいものは無いものだろうか。
0463デフォルトの名無しさん
2007/01/07(日) 16:04:080464デフォルトの名無しさん
2007/01/08(月) 01:14:53Data.Array は書き換えのたびに全体をコピーしている。ただし MArray を使えばモナド操作で一部の書き換えが可能。
リストの init はコピーを発生するが、 ByteString の init は定数時間でコピーを発生させない。
Data.Sequence はそれなりの償却コストがかかる。
というようにデータ構造によってそれぞれ違うから、「ドキュメントを読みなさい」というのが正解。
下位の関数の出力がIOでも、それに fmap で純関数を適用すればいいのでは。
綺麗に書きたいなら Control.Applicative が使えるかもしれない。
0465デフォルトの名無しさん
2007/01/08(月) 16:36:54可能なら、どうやったらよい?
知りたいのは、実行したプログラムのどこにどの程度の処理時間がかかっているか、
各関数は何回評価されたか、ってあたり。トータルじゃなくて内訳を見たい。
0466デフォルトの名無しさん
2007/01/08(月) 17:19:06GHCを使ってるなら、-prof -auto-all付きでコンパイルして、
できた実行ファイルを+RTS -p付きで実行すると、
<実行ファイル名>.profというファイルにプロファイル結果が出力される。
詳しくはGHCのユーザガイドを読んでくれ。
0467デフォルトの名無しさん
2007/01/08(月) 17:26:45例:
ghc --make hoge.hs -o hoge.exe -prof -auto-all
hoge +RTS -p
type hoge.prof
Gtk2Hsのサンプルで.profファイルのビュアーがあるみたいね。
http://sourceforge.net/project/screenshots.php?group_id=49207&ssid=5881
0468デフォルトの名無しさん
2007/01/08(月) 22:34:49thx。
ユーザガイドのまるまる1章がProfilingなのね。
ざっと眺めただけだけど、heap profilingなんかは使い込むと便利そうだ。
まずは書いてもらった基本操作から使ってみるよ。
0469デフォルトの名無しさん
2007/01/10(水) 11:02:23Haskellでは空リストがリストの終わりを表すと聞きました。
では、map関数を使って空リストに関数を適用させることは出来ないのでしょうか?
0470デフォルトの名無しさん
2007/01/10(水) 11:11:25実際に組みながら覚えるのが良いんだろうけど・・・
自分としては最終的にはモナディウスみたいなゲームを作ってみたいのですが
グラフィックを扱うプログラムって、初心者には敷居が高いんですかね?
初心者がHaskellを覚える為に組むとしたら、どんなものがオススメですか?
抽象的ですみませんが、皆さんがどんなプログラム組んで覚えたかでもよいので教えてください。
0471デフォルトの名無しさん
2007/01/10(水) 11:23:59空リストがリストの終わりを表すのではなくて、空がリストの終わりです。
プログラミング的には空リストをリストの終わりとして処理しています。
空に関数を適用できません。
>>470
グラフィックスを扱うのはIO周りの事がよく理解できていれば可能だと思います。
0472デフォルトの名無しさん
2007/01/10(水) 11:25:500473デフォルトの名無しさん
2007/01/10(水) 11:28:370474デフォルトの名無しさん
2007/01/10(水) 11:28:40ゲームプログラミングには Haskell は向いてないと思う。
>469
それくらいやってみりゃいいだろ。なんでいちいち聞くの。
Prelude> map id []
[]
というかなんで出来ないと思うのかがわからん。
0475デフォルトの名無しさん
2007/01/10(水) 11:32:07>空に関数を適用できません。
これはひどい。
0476デフォルトの名無しさん
2007/01/10(水) 11:33:32だったら空リストじゃなくて空に関数適用するようなHaskellコード書いてミロや!!!!
0477デフォルトの名無しさん
2007/01/10(水) 11:47:52あんたの空と空リストの定義がおかしいだけ
空リストは空そのものとして定義される。これは仕様書にもある。
0478デフォルトの名無しさん
2007/01/10(水) 12:53:52回答有難うございます。
結局空のリストに関数適用はできるという理解でよいのでしょうか?
Prelude> map id []
[]
このidという関数はどういう定義なのでしょうか?
また、
Hugs> map id [[],[],[]]
[[],[],[]]
という事も出来たのですが、この場合map関数は
「空リストのリスト」の最後に空リストがもう一こ上のレベル?で有るから
「空のリストのリスト」は終わりと判断して再帰を終わらせるという理解で良いでしょうか?
0479デフォルトの名無しさん
2007/01/10(水) 13:37:57まぁいいから外にでて空を見上げてみろ、今日は良い天気だ、「のどか」って書いてないか?
0480デフォルトの名無しさん
2007/01/10(水) 14:09:220481デフォルトの名無しさん
2007/01/10(水) 14:34:16「屋外にでて上を見上げて」なら推論可能?
0482デフォルトの名無しさん
2007/01/10(水) 15:33:24idとmapの定義は
id :: a -> a
id x = x
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
この定義に従って、
map id [[],[],[]]
=> map id ([] : [[],[]])
=> id [] : map id [[],[]]
=> [] : map id ([] : [[]])
=> [] : (id [] : map id [[]])
=> [] : ( [] : map id ([] : []) )
=> [] : ( [] : ( id [] : map id [] ) )
=> [] : ( [] : ( [] : [] ))
=> [] : ( [] : [[]] )
=> [] : [[], []]
=> [[], [], []]
のように計算される。
0483デフォルトの名無しさん
2007/01/10(水) 16:34:21そんな記述はどこにもない。
あるというならどの文献のどのページにあるのか言ってみろ。
0484デフォルトの名無しさん
2007/01/10(水) 16:42:380485デフォルトの名無しさん
2007/01/10(水) 17:49:05すみません、
Prelude> map succ [1,2,3]
[2,3,4]
を実行するとちゃんと実行できるんですけど、
Prelude> map succ [[],[],[]]
<interactive>:1:4:
No instance for (Enum [a])
arising from use of `succ' at <interactive>:1:4-7
Probable fix: add an instance declaration for (Enum [a])
In the first argument of `map', namely `succ'
In the definition of `it': it = map succ [[], [], []]
を実行するとあまりうれしくない結果が出てきます。
どうしてですか?[]は何型なのでしょう・・・
0486デフォルトの名無しさん
2007/01/10(水) 17:51:370487デフォルトの名無しさん
2007/01/10(水) 17:55:36> square n が n * n と等値。
ええ?!じゃあ、たとえば、
test :: Int -> Int
x * x = test x
ってコンパイル通るんですか?!
0488デフォルトの名無しさん
2007/01/10(水) 19:57:43>どうしてですか?[]は何型なのでしょう・・・
結局の所、map succ [[], [], []] = [succ [], succ [], succ []]だから、
そのエラーはsucc []を実行しようとして失敗したってこと。
なんで失敗するかと言えば、succの引数はEnumクラスのインスタンスじゃないとダメなのに
[] は [a]型でEnumクラスのインスタンスではないから。
HugsとかGHCiでは関数とか値の型は :t 〜 って入力すればわかる。
例えば map succ の型を知りたい時は、
Prelude> :t map succ
map succ :: Enum a => [a] -> [a]
0489デフォルトの名無しさん
2007/01/10(水) 20:06:26mapsucc :: [Int] -> [Int]
mapsucc lst = map succ lst
試しに、上のようなコードを書いてみました。
mapsucc [1,2,3]
を実行すると、
[2,3,4]
のように表示されました。
ここまでは良いのですが、
mapsucc [[],[],[]]
を実行すると、
<interactive>:1:9:
Couldn't match `Int' against `[a]'
Expected type: Int
Inferred type: [a]
In the list element: []
In the first argument of `mapsucc', namely `[[], [], []]'
と表示されました。
おかしいですよね、これって。
0490デフォルトの名無しさん
2007/01/10(水) 20:08:470491デフォルトの名無しさん
2007/01/10(水) 20:11:37[[], [], []] :: [Int] であるためには [] :: Int でないといけない。
だけど[]は[a]であってIntではない。よって型の不一致(Couldn't match `Int' against `[a]')
0492デフォルトの名無しさん
2007/01/10(水) 20:22:32空の型は総称的定義されているべきだと思うんですけど。
上のコードでは
mapsucc :: [Int] -> [Int]
のように明示的に書いたので、Int型にインスタンシエイトされるべきですよね?
0493デフォルトの名無しさん
2007/01/10(水) 20:35:27> 明示的に書いたので、Int型にインスタンシエイトされるべきですよね?
その理屈でいくと、[] + 1 :: Intとか1 + [] :: Int って書いたら
なんか適当なInt型の値が得られなきゃいけないって事?
0494デフォルトの名無しさん
2007/01/10(水) 20:40:391+[]なんて定義できないよね。そう思うよね?
だから、空は抽象的なものであって、Haskellの仕様では、空リストと空は別ものなのです。
0495デフォルトの名無しさん
2007/01/10(水) 20:58:04おそらく
[1,2,3] = 1 : [2, 3] = 1 : ( 2 : [3] ) = 1 : ( 2 : ( 3 : [] ) )
と分解できるから[]が終端なんだと言ったんだろうけど、
これは単に空リスト[]の先頭に3, 2, 1を順に追加していったものがリスト[1,2,3]だってこと。
もしくは、(有限)リストから先頭を取り除く操作をしていった場合、空リスト[]に行き着いた時点でそれ以上先頭を取り除くことが出来なくなるってこと。
0496デフォルトの名無しさん
2007/01/10(水) 21:22:15ただ、リストの要素として[]がリスト[1,2,3]の終わりに入っていると考えるのは間違い。
0497デフォルトの名無しさん
2007/01/10(水) 21:31:430498デフォルトの名無しさん
2007/01/10(水) 22:44:010499デフォルトの名無しさん
2007/01/10(水) 22:55:26本当の集合って何?
0500469
2007/01/10(水) 22:57:09>>495
すいません。「Haskellでは空リストがリストの終わりを表す」とは書いてないです。
やさしいHaskellのp36に
「空リストは特別な値で、リストの末尾に現れます」とあります。
で、自分が「C言語の文字列でいうところのヌル文字みたいなものだ」と
勝手に解釈したんです。
で、
「map関数で何かのリストに適当な関数を適用するとき、
リストの終端を判定するとき空リストがあれば、
再帰を打ち切る」んだなと思ったんです。
もし曲解している点があれば、指摘してください。
0501デフォルトの名無しさん
2007/01/10(水) 23:14:43Haskellのリストは単方向リスト。
Cの文字列みたいに何らかのターミネータを持つ配列じゃない。
struct LIST{void*value;struct LIST*next;};
Cで言うと(struct LIST*)NULLが空リスト。
要するにHaskellはnextの値が空リストかどうかで終端を判断している。
君はvalueが特殊な値('\0')のときに終端になるのだと勘違いしている。
と、説明書いてみたけど、うーん自分でもこれじゃあ分かりくいな。どうかけばいいだろう。
0502デフォルトの名無しさん
2007/01/10(水) 23:34:08enum Tag { NIL, CONS };
struct Nil { Tag t; };
struct Cons { Tag t; void *head; union List *tail; };
union List { struct Nil nil; struct Cons cons; };
という感じでないか
0503デフォルトの名無しさん
2007/01/11(木) 03:18:200504デフォルトの名無しさん
2007/01/11(木) 06:47:50Cons → 1
↓
Cons → 2
↓
Nil
というような構造になっていて、Haskellコードではこれを 1:(2:[])
と表現しています。 [] はこの場合の Nil のことを表す記号です。
いちいち 1:(2:(3:(4:[]))) と書くのは面倒なので
[1,2,3,4] と書いてもよくて、これは 1:(2:(3:(4:[]))) と解釈されます。
さて、map f という関数は、関数 f をこの Cons の右側につながった値に
それぞれ適用する関数です。
したがって、上の 1:(2:[]) に map f を適用した結果は
Cons → f 1
↓
Cons → f 2
↓
Nil
となります。
map f を [] に適用するとどうなるかというと、 [] は
Nil
という構造なのでfを適用する値が一個もなく、したがって結果は
Nil
のままです。よって map f [] の結果は [] となります。
0505デフォルトの名無しさん
2007/01/11(木) 21:57:46SICPって読んだほうがいい?
0506デフォルトの名無しさん
2007/01/11(木) 22:08:52目的による。
何がしたいの?
0507デフォルトの名無しさん
2007/01/11(木) 22:36:40最近寝付きが悪いので…
0508デフォルトの名無しさん
2007/01/11(木) 22:39:11読むことを激しく勧める
0509デフォルトの名無しさん
2007/01/11(木) 22:47:17この手の専門書は、原書より訳本の方がいいよね?
へんてこな翻訳文体が心地よい眠りに誘うと期待
0510デフォルトの名無しさん
2007/01/11(木) 22:52:09よほどスラスラ英語を読めるのでもなければ
そんな訳でも訳の方がマシだと思う。
少なくともSICP程度の訳であれば。
0511デフォルトの名無しさん
2007/01/11(木) 22:54:46へんてこなのには違いないんだけど、なんか勝手に訳語作っちゃったり、痛さあふれる訳本です。
0512デフォルトの名無しさん
2007/01/11(木) 23:11:240513デフォルトの名無しさん
2007/01/11(木) 23:20:11偉い人が作って、みんながそれが正しいと思って使うようになるんだけど、
誰もその人の訳語を使わないし、そもそも新しい訳語を作れるほど自分は偉いんだ、
と思いこんでる身の程知らずのタコだから痛いんですよ。
0514デフォルトの名無しさん
2007/01/12(金) 20:49:230515デフォルトの名無しさん
2007/01/12(金) 21:14:22ただ議論がしたいからここを利用しているだけで、
なくなれば別のところにいくだけです。
0516デフォルトの名無しさん
2007/01/12(金) 21:24:320517デフォルトの名無しさん
2007/01/12(金) 21:35:57で良いんじゃねぇ?
もしくはHaskellで適当な掲示板作るとか。
出来ないかな。
俺は2ch潰れて欲しいな。
人文科学の観点から、これほど大きい掲示板が潰れると
どういう影響が出るか見てみたい。
まるで夕張が国の実験場になるように。
0518デフォルトの名無しさん
2007/01/12(金) 21:57:27個人的な立場で言うと、まじめにGoogle無くなるよりも困る
0519デフォルトの名無しさん
2007/01/12(金) 22:11:42ただ、専ブラの発明は偉大であると思ったので、
この方式自体は生き残るだろう。
ブログってRSSフィードを出力するのが増えてるけど、
専ブラで読める形式を出力するのってどうね?
とブログスレで提案したんだが、だれも作ろうとしない。
ああ、スレ違い
0520デフォルトの名無しさん
2007/01/12(金) 22:27:13無くて済むのならない方が良い。絶対に良い。
0521デフォルトの名無しさん
2007/01/12(金) 22:36:482chを毎日見る人間ってけっこう多いと思うぞ
インターネットと2chが1:1になるくらい
となるとブラウザと2chブラウザはわけて存在したほうがスッキリする
0522デフォルトの名無しさん
2007/01/13(土) 03:20:14文字
文字列
文字のリスト
文字列のリスト
の実感がイマイチわからねぇ。
関数の引数の型によって、文字のリストが文字列になったりその逆になったり
う〜ん。
あと、質問なんですけれども
多相型と型変数ってどこがちがうのでしょうか?
0523デフォルトの名無しさん
2007/01/13(土) 03:32:11オマエ、マチガエテル。
2ch ハ、インターネット ニ フクマレルカラ ソレジャ 2ch シカ リヨウシテイナイコトニナルネ。
2ch ブラウザ ガ アレバ ブラウザ イラナイネ。
0524デフォルトの名無しさん
2007/01/13(土) 04:21:070525デフォルトの名無しさん
2007/01/13(土) 04:57:05C言語はchar配列が,いわゆる「文字列」じゃん
Haskellは [Char] が「文字列」
あと多相型を表現する(書き表す?)ために使われるのが型変数でそ
0526デフォルトの名無しさん
2007/01/13(土) 05:23:400527デフォルトの名無しさん
2007/01/13(土) 07:04:55きっとインターネット以外のネットワークを使って2chにアクセスしてるんだよ。
0528デフォルトの名無しさん
2007/01/13(土) 10:21:050529デフォルトの名無しさん
2007/01/13(土) 11:26:21文字 Char
文字列 [Char]
文字のリスト [Char]
文字列のリスト [[Char]]
0530デフォルトの名無しさん
2007/01/13(土) 11:27:010531デフォルトの名無しさん
2007/01/13(土) 13:17:020532デフォルトの名無しさん
2007/01/13(土) 14:05:00l| -‐‐- |l
,イ」_ |ヽ_| l、
/└-.二| ヽ,ゝl
l ,.-ー\/. 、l
| /.__';_..ン、 ビ〜ィ〜ム かがーやーく♪
/ /<二> <二>!゙、
//--─'( _●_)`ーミヘ フラッシュバックに〜ぃ♪
<-''彡、 |∪| 、` ̄ ̄ヽ
/ __ ヽノ Y ̄) |
(___) Y_ノ
\ |
| /\ \
| / ) )
∪ ( \
\_)
ll ll
l| -‐‐- |l
,イ」_ |ヽ_| l、
/└-.二| ヽ,ゝl
l ,.-ー\/. 、l
| /.__';_..ン、 ヤツのかげーー♪
/ /<二> <二>!゙、
//--─'( _●_)`ーミヘ
<-''彡、 |∪| ミ __>
( (/ ヽノ_ |
ヽ/ (___ノ
| /
/ /\ |
( ( ヽ |
/ ) ∪
(_/
0533デフォルトの名無しさん
2007/01/13(土) 14:05:42_人人人人人人人人人人人人人人人_
> シャア♪ シャア♪ シャア♪ <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
ll ll ll ll ll ll
l| -‐‐- |l __ l| -‐‐- |l __ l| -‐‐- |l __
,イ」_ |ヽ_| l、〈〈〈〈 ヽ ,イ」_ |ヽ_| l、〈〈〈〈 ヽ ,イ」_ |ヽ_| l、〈〈〈〈 ヽ
/└-.二| ヽ,ゝl.〈⊃ } /└-.二| ヽ,ゝl.〈⊃ }./└-.二| ヽ,ゝl.〈⊃ }
l ,.-ー\/. 、l | |. l ,.-ー\/. 、l | | l ,.-ー\/. 、l | |
| /.__';_..ン、! ! | /.__';_..ン、! !| /.__';_..ン、! !
/ /<二> <二>!゙、 // /<二> <二>!゙、 // /<二> <二>!゙、 /
//--─'( _●_)`ーミ /.//--─'( _●_)`ーミ / //--─'( _●_)`ーミ /
<-''彡、 |∪| / <-''彡、 |∪| / <-''彡、 |∪| /
/ __ ヽノ / / __ ヽノ / / __ ヽノ /
(___) / (___) / (___) /
0534デフォルトの名無しさん
2007/01/15(月) 22:00:100535デフォルトの名無しさん
2007/01/15(月) 22:04:01関数型言語の総合スレはこちらです↓
関数型言語Part IV
http://pc10.2ch.net/test/read.cgi/tech/1083649982/
0536デフォルトの名無しさん
2007/01/19(金) 01:52:30廃れてんなぁ
なんかHaskelニュースとかねーのか
0537デフォルトの名無しさん
2007/01/19(金) 09:31:310538デフォルトの名無しさん
2007/01/20(土) 19:04:510539デフォルトの名無しさん
2007/01/20(土) 21:06:220540デフォルトの名無しさん
2007/01/21(日) 08:45:34やさしいHaskellのp107から。
myIf :: Bool -> a -> a -> a
myIf True t e = t
myIf False t e = e
main = do myif (True) (putStrLn "then") (putStrLn "else")
という関数を定義して、このプログラムがthenだけ表示されれば、
アクションputStrLn "elseは評価されていないことが分かります。
とあるんだけれど、何が言いたいのか良く分からん。
このプログラムを実行したら、thenが表示されるのは当たり前じゃないのか?
これのどこが評価に必要な式だけが評価されることの証拠になるんだ?
Cの
if ( True == True){
printf("then\n");
}
printf("else\n");
とどこが違うんだ。
これも、printf("else\n");は評価されて無いぞ。
それともif文を実装した点に意味があるって事?
0541デフォルトの名無しさん
2007/01/21(日) 08:53:33int myif(int a, int b, int c) {
return a ? b : c;
}
int main() {
myif(1, printf("true"), printf("false"));
}
0542デフォルトの名無しさん
2007/01/21(日) 09:38:09うん、それもわかるよ。
でもそれだって結局ifの言い換えでしょう?
俺が聞きたいのは
main = do myif (True) (putStrLn "then") (putStrLn "else")
でthenが実行されるのは当然で、何がすごいのか分からないんだ。
これと遅延評価の何が関係有るの?
教えて、偉い人。
0543デフォルトの名無しさん
2007/01/21(日) 10:02:42Cには「中身が実行されないことがある構文」(ifとか)はあるけど、
「引数が評価されないことがある関数」はない。
例えば、Cでは、
f(4 / 0)
という式は、fがどんな関数であっても零除算でエラーだが、Haskellでは、
f (4 `div` 0)
がエラーになるかどうかはfに依存する。
同様に、三項演算子と同じはたらきをする「関数」はCでは実装できないが、Haskellではできる。
>main = do myif (True) (putStrLn "then") (putStrLn "else")
ややこしいことに、この例に限っていえば、遅延評価は関係ない。
たとえputStrLn "else"が評価されたとしても、それで「else」が出力される訳ではない。
これはHaskellのIOの話で、遅延評価とは別の問題。
だから、遅延評価の話をするときは、ややこしくなるのでIOの例を使わない方が良いと思う。
0544デフォルトの名無しさん
2007/01/21(日) 11:09:270545デフォルトの名無しさん
2007/01/21(日) 15:55:04http://tv.goo.ne.jp/contents/program/008/0004/20070122_0250/index.html
0546デフォルトの名無しさん
2007/01/21(日) 17:08:29ゴルァ!
0547デフォルトの名無しさん
2007/01/22(月) 00:20:55他のletの中とかならマッチしない時点でエラーが出ると思うのですが
なぜこのやりかたで絞込みができるのでしょうか?
内包表記が特別扱いされてるとか?
0548デフォルトの名無しさん
2007/01/22(月) 00:31:11リストはMonadPlusで、内包表記はdo記法の略記。
doの中でマッチングが失敗するとモナドのfailが呼ばれ、リストのfailはmzeroを返すから
その後に続く式が無効化される。
0549548
2007/01/22(月) 02:06:48Prelude> let hoge = zip [1,2,3,4,5] [True,False,True,True,False]
Prelude> do (n,True) <- hoge; return n
[1,3,4]
Prelude> hoge >>= \(n,True) -> return n
[1*** Exception: <interactive>:1:49-69: Non-exhaustive patterns in lambda
なるほど。特別扱いではあるけどユーザも使えるわけですね。
0550デフォルトの名無しさん
2007/01/22(月) 19:51:170551デフォルトの名無しさん
2007/01/22(月) 20:06:18は
E >>= \x -> case x of
P -> do REST...
_ -> fail "message"
の構文糖
0552デフォルトの名無しさん
2007/01/22(月) 23:45:48> doの中でマッチングが失敗するとモナドのfailが呼ばれ
というところが構文糖だけじゃないんじゃない?ということだと思う。
0553デフォルトの名無しさん
2007/01/22(月) 23:47:250554デフォルトの名無しさん
2007/01/23(火) 02:07:43[ e | p <- l, Q ] =
let ok p = [ e | Q ]
ok _ = []
in concatMap ok l
[ n | (n,True) <- zip [1,2,3,4,5] [True,False,True,False,False] ]
=> let ok (n,True) = [n]; ok _ = [] in concatMap ok (zip [1,2,3,4,5] [True,False,True,False,False])
意味はほぼ一緒だが
0555デフォルトの名無しさん
2007/01/23(火) 02:27:29Haskell98ではなくて、GHCではそうだね。
0556デフォルトの名無しさん
2007/01/23(火) 15:17:18update h x v y | x == y = v
| otherwise = lookup h y
という関数の定義に関して、
update :: Assoc a b -> a -> b -> Assoc a b
の第一パラメータとなっている、Assoc a b は、
update h x v y | x == y = v
| otherwise = lookup h y
という実装において、
Assoc a b の a が h に、 b が x に対応しているのでしょうか?
よろしくお願いします。
0557デフォルトの名無しさん
2007/01/23(火) 16:08:51type Assoc a b = a -> b
と定義してあると思うので、それを前提にする。
>Assoc a b の a が h に、 b が x に対応しているのでしょうか?
違う。仮引数の型は、
h :: Assoc a b
x :: a
v :: b
y :: a
これは、updateの型をAssocなしで書いてみると分かり易い。
update :: (a -> b) -> a -> b -> a -> b
h x v y
0558デフォルトの名無しさん
2007/01/23(火) 19:05:54返信ありがとうございます。
>これは、updateの型をAssocなしで書いてみると分かり易い。
>update :: (a -> b) -> a -> b -> a -> b
> h x v y
とのことですが、
update :: Assoc a b -> a -> b -> Assoc a b
という定義には、その
>update :: (a -> b) -> a -> b -> a -> b
> h x v y
↑
にあるような、y に相当するパラメータの指定が、
関数定義に存在していないのが理解できません。
これは何か特殊な仕掛けがあるのでしょうか?
0559デフォルトの名無しさん
2007/01/23(火) 19:07:50ずれてる。>>557をもう一度見返して。
0560デフォルトの名無しさん
2007/01/23(火) 19:35:24もっと単純な例を挙げる。
foo :: Int -> String -> Bool
という関数があるとする。これはもちろん二引数関数。
括弧を補って丁寧に書くと、この型は次のようになる。(納得できないならカリー化を復習すべし)
foo :: Int -> (String -> Bool)
ここで(String -> Bool)の部分を別名に置き換えても意味は変わらない。
type StringProp = String -> Bool
foo :: Int -> StringProp
こう書くとfooはいかにも一引数関数だけど、型は最初のfooと変わらない。
よって、実装を書く際は引数を二つ使える。例えば、
foo :: Int -> StringProp
foo n s = length s < n
ついでだが、
>関数定義に存在していないのが理解できません。
「update :: Assoc a b -> a -> b -> Assoc a b」みたいなのは型シグネチャといって、
ふつう定義とはいわないと思う。
0561デフォルトの名無しさん
2007/01/23(火) 19:54:150562デフォルトの名無しさん
2007/01/23(火) 20:58:580563デフォルトの名無しさん
2007/01/23(火) 21:09:000565デフォルトの名無しさん
2007/01/24(水) 01:49:280566デフォルトの名無しさん
2007/01/24(水) 07:48:460567デフォルトの名無しさん
2007/01/24(水) 18:11:510568デフォルトの名無しさん
2007/01/24(水) 20:47:370569デフォルトの名無しさん
2007/01/27(土) 22:31:06何を使うのがお勧め? GHCの付属モジュールにはないようなのだが。
とりあえず、socatという、STDIOをソケットにつなげるツールを
使ってwrapしてみようかとは思っているのだが。
そもそもHaskellでのネットワークプログラミングが、IOと同じ
要領でいいのかどうかも知らないけど。
0570デフォルトの名無しさん
2007/01/27(土) 22:58:460571デフォルトの名無しさん
2007/01/27(土) 23:10:12>GHCの付属モジュールにはないようなのだが。
Network.Socketじゃだめなのか?
0572デフォルトの名無しさん
2007/01/27(土) 23:18:27な!
http://haskell.org/onlinereport/
が全てだと勘違いしてたよ。どうもありがと。
0573デフォルトの名無しさん
2007/01/27(土) 23:18:40何を使うのがお勧め? GHCの付属モジュールにはないようなのだが。
0574デフォルトの名無しさん
2007/01/27(土) 23:27:34でも資料がほとんどないねぇ。
GHC用のGUIライブラリってwxHaskell, gtk2hsとかほかにも幾つかあるけど、
2006年中に新バージョンがリリースされたものって1つもないよね。
0575デフォルトの名無しさん
2007/01/28(日) 00:03:340576デフォルトの名無しさん
2007/01/28(日) 00:31:28http://www.haskell.org/ObjectIO/life.html
http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/hslibs/object-io/Examples/Life/
import Graphics.UI.ObjectIO
-- ghc hello.hs -package objectio -o hello.exe -optl "-Wl,--subsystem,windows"
main = startIO SDI () (openWindow undefined window) []
window = Window title controls attrs
where
title = "hello world"
attrs = [ WindowClose $ noLS closeProcess, WindowViewDomain dom ]
dom = Rectangle (Point2 0 0) (Point2 480 320)
controls = text :+: button
where
text = TextControl "Hello" [ControlPos (Center, Vector2 0 50)]
button = ButtonControl "World" [pos, onClick]
where
pos = ControlPos (BelowPrev, Vector2 (-20) 20)
onClick = ControlFunction $ noLS closeProcess
0577デフォルトの名無しさん
2007/01/29(月) 18:44:30開発が止まってるね。
「GTKへの移植は次期リリースで」っていうのを見て期待してたんだけど。
0578デフォルトの名無しさん
2007/01/29(月) 19:12:04気づいたらVisual Haskell 0.2が出てるんですが、
依然としてVisual Haskellさんは問題ありありな感じだったりします?
0579デフォルトの名無しさん
2007/01/29(月) 19:30:04もちろん、問題ありです。
現状では、Windowsでのプログラミング環境は、meadow + haskell-mode + GHCが一番使いやすいですね。
0580デフォルトの名無しさん
2007/01/29(月) 19:49:30問題のありそな処理系使うほどもっさりIDE好きでもないのでスルーしておきますわ
アリガトウ アリガトウ
0581デフォルトの名無しさん
2007/01/29(月) 20:08:20IDE好きでないとのことですが、
IDEならEclipseもHaskellをサポートしているようですよ。
0582デフォルトの名無しさん
2007/01/29(月) 20:25:26Eclipseも使う機会無くはないんですが冷静に考えると
haskellで大きいもの書くことがほぼ無いのでテキストエディタとghcで十分な感じです
0583デフォルトの名無しさん
2007/01/29(月) 20:31:52ttp://061196246067.cidr.odn.ne.jp/soutaro/20041004
> eclipseの標準入力がおかしいとか,実行ファイル名を指定できないとか,
> コンパイルオプションを指定できないとか,むきーってなる.
誰か、むきーってなった人いませんか?
0584デフォルトの名無しさん
2007/01/29(月) 20:51:18確かに、eclipseのhaskellプラグインも不完全だと思いました。
たとえば、内部でghciを起動したあと、そのプロセスを殺さずに、新たに内部でghciを起動すると、
前のghciのプロセスがそのまま残ってしまう、とか^^;
0585デフォルトの名無しさん
2007/01/29(月) 20:54:08自動インデント機能がおかしくなる場合があるのを見つけたので、
結局、haskell-modeに落ち着いたわけです。
0586デフォルトの名無しさん
2007/01/29(月) 21:01:37情報アリガトウ
0587デフォルトの名無しさん
2007/01/29(月) 21:26:420588デフォルトの名無しさん
2007/01/30(火) 05:53:450589デフォルトの名無しさん
2007/01/30(火) 21:56:40自動整形するのってどうやるの?
できなかったっけ?
0590デフォルトの名無しさん
2007/01/30(火) 23:38:11すんごい単純なコードだったよ。
ちょっと前の話なのであれだけど。
0591デフォルトの名無しさん
2007/01/31(水) 15:15:10名前の長さと括弧の多さにorzとなってる。
0592デフォルトの名無しさん
2007/01/31(水) 15:42:09C++ではどうがんばってもHaskellっぽく書くのは無理だと思う。
遅延評価ができないから。
0593デフォルトの名無しさん
2007/01/31(水) 16:41:05遅延評価ができなくとも、HaskellのリストをC++のイテレータだと思えば
リスト周りくらいはイテレータ間の変換として作れそうと思ったのです。
-- なんだかboostにありそうな気もするけど
0594デフォルトの名無しさん
2007/01/31(水) 18:56:430595デフォルトの名無しさん
2007/01/31(水) 19:23:54こういうのだろうか。
C++は驚くほどなんでもできるけど、何かしようとするといちいち手間が掛かるし、
細かい言語上の制約がうざったいので、遊び道具にするのも一苦労だ。
0596デフォルトの名無しさん
2007/01/31(水) 20:08:27core2duoのlinux上で試してるんだけど、独立した計算を2つのthreadで同時に
やると、1つずつやるより遅くなってしまう…
main = do
m1 <- newMVar iv
m2 <- newMVar iv
s3 <- takeMVar m1
s4 <- takeMVar m2
t1 <- forkIO (summer m1 80000000)
t2 <- forkIO (summer m2 80000000) -- (1)
s1 <- takeMVar m1 -- (2)
s2 <- takeMVar m2
putStr $ "s1: " ++ (show s1) ++ " s2: " ++ (show s2)
summer m n = if s > 0 then putMVar m s else putMVar m 1
where s = summing n 0 -- summingは0からnまでの和を求める関数
上のcodeだと13秒くらいだが,(1)(2)を入れ替える(つまりthread t1の終了を待ってから
thread t2をはじめる)と、9秒くらいになる。
compile時は-smpをつけて、実行時には+RTS -N2を指定してるんだが…
0597デフォルトの名無しさん
2007/02/01(木) 00:33:30{-# NOINLINE hoge #-} を一杯生成したいんだが
0598596
2007/02/01(木) 19:57:450599デフォルトの名無しさん
2007/02/01(木) 20:06:54キャッシュ汚染のせいだと思う・・・
0600デフォルトの名無しさん
2007/02/01(木) 20:25:58どうもです。
一応summing(0からnまでの和を求める関数)も引数をeagerに評価させて
ほとんどメモリを消費しないようにしてるんだけど…
summing 0 a = a
summing n a | n > 0 && a >= 0 = summing (n-1) (a+n)
これでもキャッシュ汚染は起こりますか?
0601デフォルトの名無しさん
2007/02/01(木) 23:03:28HaskellのライブラリAPIって、ライブラリのソースから自動生成された
(あまり整理されているとは言えない)ドキュメントしかないの?
Network.Socket の使い方が全くわからず数日間悩んでいるのですが‥‥‥。
例えば receipe 集みたいなサイトご存知でしたら教えてください。
本は「ふつうの〜」しか持ってませんが、網羅的な本があったら
がんばって買ってもいいかも。
0602デフォルトの名無しさん
2007/02/01(木) 23:07:530603デフォルトの名無しさん
2007/02/01(木) 23:11:00論文ぐらいしかないよ。
0604デフォルトの名無しさん
2007/02/01(木) 23:30:55それしかない。
Network.Socketについていうと、リファレンスにも書いてあるが、
インタフェースはCのAPIそのままだから、そっちを調べるべき。
関数に説明が付いていないのもこれが理由。
0605デフォルトの名無しさん
2007/02/01(木) 23:33:180606P2Pソフトを妄想中
2007/02/02(金) 00:24:58ありがとう。Cのsocket APIは理解しているつもりなので、想像はできたの
ですが、なんかHaskellicな書き方に慣れないせいか、もうちょっと手引きの
ようなものがあると楽なんですけどね。
なんとかがんばってみます。対向はとりあえずpythonあたりで作って
テスト環境を作ってみないと‥‥‥
0607デフォルトの名無しさん
2007/02/02(金) 17:51:57あの不親切なドキュメントみながら書いてみた
import Network.Socket
main = putStrLn =<< do
sock <- socket AF_INET Stream 0
addr <- inet_addr "66.249.89.104" >>= \x -> return $ SockAddrInet 80 x
connect sock addr
send sock "GET / HTTP/1.1\nHost: www.google.co.jp\n\n"
recv sock 10000000 >>= \x -> sClose sock >> return x
0608デフォルトの名無しさん
2007/02/02(金) 21:19:00ふつうにネットワークのクライアントプログラムを書くだけなら、 Network で充分じゃないかな。
それでは無理な細かいところを調整するために Network.Socket はある。
逆に言うと、そういう細かいところの欲求ってのはCレベルのAPIを叩きたいっ
てことなんだから、関数名と型名だけあれば、まあ充分なんじゃない。
使いづらいし、ちょっとわかりづらいってのは同意だが。
0609デフォルトの名無しさん
2007/02/04(日) 23:36:03代用品は?
0610P2Pソフトを妄想中
2007/02/05(月) 09:39:47ありがとう。こっちも、
http://homepages.paradise.net.nz/warrickg/haskell/http/
っての見付けてきて勉強中です。
>608
UDP使いたいのですが、Networkでできる?
あとIPv6も(って、AF_INET6は定義されているが sockaddr_in6 に対応する
ものが無さげな罠‥‥‥)
0611デフォルトの名無しさん
2007/02/05(月) 10:00:040612デフォルトの名無しさん
2007/02/05(月) 11:52:32詳しく。
0613デフォルトの名無しさん
2007/02/05(月) 12:38:09Haskellじゃなくて、CPUのキャッシュをコンカレントなスレッドが
奪いあったのではないか、という指摘なんじゃないかと。
正直、core2duoのコアとキャッシュの関係を知らないので
そういうことがおこるかどうかは知らない。普通のSMPで、かつ
スケジューラが十分賢ければ、2つactiveなthreadが走ったら
それぞれのthreadをある程度固定化するようにスケジュールして
くれると思うんだけど。
0615デフォルトの名無しさん
2007/02/05(月) 19:28:070616デフォルトの名無しさん
2007/02/05(月) 21:43:29実はsmp対応になってなかっただけ、ってオチがいちばんありそうだな。
0617デフォルトの名無しさん
2007/02/06(火) 00:58:28まだ8bitのバイト列の書き出しすらできねぇ
俺様の頭は激しく悪いな
0618デフォルトの名無しさん
2007/02/06(火) 01:27:51つ[putStr (map toEnum [104,111,103,101])]
つ[import Bits (.&. .|. xor shiftL shiftR)]
0619デフォルトの名無しさん
2007/02/06(火) 01:38:04サンクス! さんざん苦労してこんなん書いてみたが馬鹿みたいだったな(笑)
頭固くなってしまったものだ‥‥‥ orz
class MessageElement a where
encode :: a->String
decode :: String->a
data MEWord8 = MEWord8 Word8 deriving (Show, Eq, Ord)
instance MessageElement MEWord8 where
encode (MEWord8 w8) = [(chr $ fromInteger $ toInteger w8)]
decode = MEWord8 . toEnum . ord . head
0620デフォルトの名無しさん
2007/02/06(火) 09:42:40さぁVBの仕事してくるか・・・
0621デフォルトの名無しさん
2007/02/07(水) 00:37:44Haskell本二冊がどの本屋でも売れ残っているんだが、どっちがおしゅしゅめ?
ちなみに言語はZ80と6800のマシン語しか知らないよ。もう忘れたけど てへ
0622デフォルトの名無しさん
2007/02/07(水) 01:22:250623デフォルトの名無しさん
2007/02/07(水) 01:36:352冊とも内容的に不十分なので、結局は生の論文を読むしかないと思う。
でも、はっきり言ってHaskellは流行らないと思うよ。
関数型言語の理論的なもとになっているラムダ計算自体が古くさい理論になりつつあるからね。
0624デフォルトの名無しさん
2007/02/07(水) 01:39:06データフローとか、今やったらいろいろと面白そうなんだが、
なにせ理論がむつかしい上に自分が手続き型にどっぷり首までつかった
人間なのと、自分の頭が悪いためたいしたことができてない。
0625デフォルトの名無しさん
2007/02/07(水) 01:39:210626デフォルトの名無しさん
2007/02/07(水) 02:14:06Haskellはいまだに嫌いだけどたまに触ってるしこのスレも見てる
0627デフォルトの名無しさん
2007/02/07(水) 02:52:45内容が不十分というのは同意するけど、論文嫁というのは訳分からん。
Haskell 98 Reportを読めば十分だろ。
0628デフォルトの名無しさん
2007/02/07(水) 03:04:45俺Haskell使えますよ? とか言いてぇぇぇぇぇぇぇぇ
0629デフォルトの名無しさん
2007/02/07(水) 08:55:10Haskellがはやらなくてよかった
0630デフォルトの名無しさん
2007/02/07(水) 09:25:590631デフォルトの名無しさん
2007/02/07(水) 09:33:270632デフォルトの名無しさん
2007/02/07(水) 10:29:46そんなことをいったらHaskellとCの違いも微々たるものじゃね?
0633デフォルトの名無しさん
2007/02/07(水) 11:28:300634デフォルトの名無しさん
2007/02/07(水) 11:55:15Haskell98Reportだけでは不十分。
これはC++プログラマがオブジェクト指向の本を読んだりするのと似ている。
0635デフォルトの名無しさん
2007/02/07(水) 12:05:23しかし、λが古くさいって、計算機のパラダイムが根本から変わったなんて話は聞いた事無いんだが…
0636デフォルトの名無しさん
2007/02/07(水) 12:18:09> GHCもHugsも98以降の拡張がガンガン入ってるしねえ。
だね。最近どんどん使われはじめているアローズに付いての記述もないし。
> しかし、λが古くさいって、計算機のパラダイムが根本から変わったなんて話は聞いた事無いんだが…
たとえば、ラムダ計算だけではシームレスにアクションを定義できないし、並列性についても定義できない。
0637デフォルトの名無しさん
2007/02/07(水) 15:56:190638デフォルトの名無しさん
2007/02/07(水) 19:47:39Cにはクロージャが無いからそこに並べるのはちょっとキツい
0639デフォルトの名無しさん
2007/02/07(水) 21:11:320640デフォルトの名無しさん
2007/02/07(水) 21:14:580641デフォルトの名無しさん
2007/02/07(水) 21:46:070642デフォルトの名無しさん
2007/02/07(水) 21:59:540643デフォルトの名無しさん
2007/02/07(水) 22:03:290644デフォルトの名無しさん
2007/02/07(水) 23:30:43>>622-623 返事ありがとう! お礼にボクのちんぽミルクをお口にあ〜ん。
ふつうのHaskell買って見たよ!アホ用に書かれているので読みやすいにゃん
Lispみたいな言語だにゃ。x:xs は Cons CAR CDR だったのかw
忘れてたけど、漏れ昔Lispを勉強したことがあったんだ。
ただし当時ナイコン族だったので脳内Lisp処理系でしか実行したことがないのだがw
うっひょー
0645デフォルトの名無しさん
2007/02/07(水) 23:44:590646デフォルトの名無しさん
2007/02/09(金) 11:07:05そうなの?
0647デフォルトの名無しさん
2007/02/09(金) 13:12:55やぁ お・ま・ん・こんばんわ 昼だけどw
とりあえず8章まではふんふんと来たが代数的データ型でつまづいた。
モナドは難しいことを避けてくれたので何も説明されてないというかw
Newtype宣言したあと『時が見える』見たいな
ところで P199の
(.)関数の型宣言
(.) :: (b−>c) −> (aー>b) −> (a−>c)
凡例 f.g
の順序はこれでいいの隗?
第一引数がgで第二引数がfになるのけ?
0648デフォルトの名無しさん
2007/02/09(金) 13:15:03第一引数がf 第二引数がg
0649デフォルトの名無しさん
2007/02/09(金) 15:25:25結局日本では学生の暇つぶしにしか使われてないのかこの言語。
0650デフォルトの名無しさん
2007/02/09(金) 16:36:24鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥烏鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
烏を探せ
0651デフォルトの名無しさん
2007/02/09(金) 20:45:33鳥鳥鳥
鳥鳥鳥
鳥鳥烏
0652デフォルトの名無しさん
2007/02/10(土) 00:08:021秒かからず気づいた俺は天才?
ところで、Javaしかできない低脳初級プログラマなんだけど
『高階関数』について、よくわからないんだ
引数に関数を利用するのが高階関数って考えるのは簡単なことだけど、
例えばJavaだって、引数にメソッドを利用することは可能だよね
class A {
private int value ; //属性
public int getNum() { //メソッド1
return 100;
}
public void setValue( int i ) { //メソッド2
value = i ;
}
public static void main( String args[] ) { //mainメソッド
setValue( getNum() ) ;
System.out.println( value ) ;
}
}
でも、Javaには高階関数なんてないわけだよね?
上に書いたclassAは、setValue( int i )の定義で、引数の中にメソッドを入れることは不可能
それと違ってHaskellは、関数の定義(型の宣言)で引数に関数を入れれる
これが高階関数?
でも結局のところ、Haskellの関数は値になるわけだから、
Javaのメソッドの引数に、メソッド入れるのと何が違うのよって・・・(???)
0653デフォルトの名無しさん
2007/02/10(土) 00:23:20たとえば、こういうのはできるかな?
hoge :: Int -> Int -> Int
hoge a b = a + b
hoge2 :: (Int -> Int) -> Int -> Int
hoge2 a b = a b
hoge3 :: Int
hoge3 = hoge2 (hoge 1) 3
0654デフォルトの名無しさん
2007/02/10(土) 01:17:28関数を引数にするのはまあいいんだけど、
関数を返す関数も高階関数になる。
0655デフォルトの名無しさん
2007/02/10(土) 01:24:01新しいJavaの仕様でクロージャを導入したらしいけど
0656デフォルトの名無しさん
2007/02/10(土) 01:28:31ttp://journal.mycom.co.jp/articles/2006/08/23/java7closuer/004.html
0657デフォルトの名無しさん
2007/02/10(土) 01:35:12とりあえずやってみる
classは省略
class X {
public int hoge( int a, int b ) {
return a + b ;
}
}
できた。
class Y {
public int hoge2( ) {
//abってa*bのこと?
}
}
わからん。
class Z {
public int hoge3(???){}
}
さっぱりわからん
先生わかりません
>>655
去年の12月にJava6がでたばっか
Java7はまだまだ先
クロージャについても、まだ検討段階のはずだけど
0658デフォルトの名無しさん
2007/02/10(土) 02:20:33と思えばだいたい OK。
hoge3 を計算すると次のようになる。
hoge3
= hoge2 (hoge 1) 3 (def. of hoge3)
= (hoge 1) 3 (def. of hoge2)
= 1 + 3 (def. of hoge)
= 4
0659デフォルトの名無しさん
2007/02/10(土) 02:31:56ここは
= hoge (1 3) (def. of hoge2)
のほうがわかりやすいな
0660デフォルトの名無しさん
2007/02/10(土) 02:56:33hoge (1 3) は hoge という関数に (1 3) という値を食わせることに
なるが、(1 3) という値が意味不明なので、正しく評価できない。
0661デフォルトの名無しさん
2007/02/10(土) 03:28:01public void setValue( int i ) {
これ、自分で引数にint iって書いてあるように、
実際に渡されているのは、関数じゃなくて返り値のintだお。
0662デフォルトの名無しさん
2007/02/10(土) 07:40:23これからJavaを新しく学ぼうとする奴は大変だな。
C++でもJavaでも、流行り出した頃に始めると
情報多いし似たようなことやってる人も多いし学習曲線もなだらかで
その後も放っておいても情報が入ってくるけど、
ある程度成熟してからはじめて勉強するのって大変よね。
0663デフォルトの名無しさん
2007/02/10(土) 14:52:11Haskellは興味を持ったばかりで全く読み取れないですが
こんな感じでよろしいでしょうか?
interface A { int f(int a, int b); }
class B { A a; int b;
B(A a, int b) { this.a = a; this.b = b; }
int f(int n) { return a.f(b, n); }
}
public class C {
static int hoge2(B b, int n) { return b.f(n); }
public static void main(String args[]) {
A hoge = new A() {
public int f(int a, int b) { return a + b; }};
B hoge1 = new B(hoge, 1);
int hoge3 = hoge2(hoge1, 3);
System.out.println(hoge3);
}
}
スレ違いっぽくてすみません。
0664デフォルトの名無しさん
2007/02/10(土) 15:41:55違う言語だから同じかどうかはっきりとは言えないわけだけど、
意図している記法とは違うと思うよ。
最終的な出力は同じでもね。
0665デフォルトの名無しさん
2007/02/10(土) 15:53:03Aを二引数の関数、Bを一引数の関数と見ればかなり良く対応していると思うが。
0666デフォルトの名無しさん
2007/02/10(土) 16:23:09それはカリー化ではない
0667デフォルトの名無しさん
2007/02/10(土) 16:34:29何が言いたいのか分からん。
>>653は高階関数と部分適用の実演であって、Haskellでは部分適用を
カリー化を利用して行うのが一般的だからそうしているに過ぎないと思ったが。
その気になれば>>663をカリー化された形に書き換えられるだろうが、
それに何か意義があるのか?
0668デフォルトの名無しさん
2007/02/10(土) 17:01:53記法はともかく雰囲気があっているか(理解が正しいかどうか)
確かめたかっただけです。
Bのfをinterfaceにしてimplementsすればよりそれっぽかったかな。
0669667
2007/02/10(土) 17:55:44感情的な攻撃をしたつもりはなかった。
そう見えたのなら謝る。投稿内容は無視してほしい。
0670668
2007/02/10(土) 18:41:28書き忘れていましたが 663=668≠652 です。
あとhoge2の型も作らないといけなかったですかね。
0671デフォルトの名無しさん
2007/02/10(土) 19:37:18> その気になれば>>663をカリー化された形に書き換えられるだろうが
Haskellで書かれたコードをJavaで模倣したいのかと思ったんだが、
もしそうなら当然模倣できるところは全部模倣すべきだよ。
0672デフォルトの名無しさん
2007/02/10(土) 20:53:090673デフォルトの名無しさん
2007/02/10(土) 21:22:01public class Main {
public static void main(String[] args) {
System.out.println("hoge3 = " + (Integer)new Hoge3().reduce());
}
}
abstract class Closure {
Stack args;
Closure() { args = new Stack(); }
Closure apply(Object o) { args.push(o); return this; }
abstract Object reduce();
}
class Hoge extends Closure {
Object reduce() { return (Integer)args.get(0) + (Integer)args.get(1); }
}
class Hoge2 extends Closure {
Object reduce() { return ((Closure)args.get(0)).apply(args.get(1)).reduce(); }
}
class Hoge3 extends Closure {
Object reduce() { return new Hoge2().apply(new Hoge().apply(1)).apply(3).reduce(); }
}
0674デフォルトの名無しさん
2007/02/10(土) 21:28:540675デフォルトの名無しさん
2007/02/10(土) 23:10:33苦労しながらsin x のテイラー展開の収束性を見るプログラムを書いたw
引数は展開次数nとxなのだが、そのうちの展開次数nだけを[1..10]にマップしたい。
だがその方法が分からんので優しいお方おすえて。
カリーかとやらで第一引数だけをまず展開するんじゃないかと思ったが、うまくいかない。
どこを勘違いしているのかも含めてvipperにも分かるように3行で教えてくれw
module Main (main) where
-- Taylor expansion / Honer's method
sin'' 0 x y = y
sin'' n x y = sin'' (n - 1) x ( 1.0 - x * y / ( (2 * n + 1) * (2 * n) ) )
sin' n x = x * sin'' n (x * x) 1.0
converge_sin n = sin' n 1.0
main = print $ map converge_sin [1..10]
出力
[0.8333333333333334,0.8416666666666667,0.841468253968254,0.8414710097001764,0.84
1470984648068,0.8414709848086585,0.8414709848078937,0.8414709848078965,0.8414709
848078965,0.8414709848078965]
じゃわカリー/~
0676デフォルトの名無しさん
2007/02/10(土) 23:27:56それでできてるじゃないか。何が不満?
0677デフォルトの名無しさん
2007/02/11(日) 00:10:04converge_sin n という捨て関数を使っているし、角度の引数xはこの中で固定化されている。
それが不満。
Mapすると同時に、角度xもパラメータとして与えたい。
0678デフォルトの名無しさん
2007/02/11(日) 00:16:49main = print $ map (flip sin' 1) [1..10]
main = print $ map (`sin'` 1) [1..10]
main = print $ map f [1..10]
where
f n = sin' n 1
好きなのをどうぞ。
0679デフォルトの名無しさん
2007/02/11(日) 00:39:28こんな感じか?
module Main (main) where
-- Taylor expansion / Honer's method
sin'' 0 x y = y
sin'' n x y = sin'' (n - 1) x ( 1.0 - x * y / ( (2 * n + 1) * (2 * n) ) )
sin' n x = x * sin'' n (x * x) 1.0
main = print $ (\x -> map (\n -> sin' n x) [1..10] ) 1.0
0680デフォルトの名無しさん
2007/02/11(日) 23:30:38手続き型に20年安住してしまったので頭固すぎて挫折しそうですパパ。
0681ちっとも理解が進まねぇorz
2007/02/11(日) 23:40:59サーバを作るときって、次のどちらが素直な設計になるますか?
ヒント頂けると有り難く。
a: State に全部の通信の状態をくるんでしまい、非同期にkeepaliveする
recvfromあるいはselectでタイムアウト付きのwaitがしたくなる、
が、探しかたが悪いのかやりかたがよくわからない‥‥‥。
b: マルチスレッドで走らせてがんばる
>596のforkIOってオイシイ?
スレッド間での状態の同期ってできるの?
c: そもそもそういう処理をHaskellでやろうと思う方が無茶
d: 俺が馬鹿なだけで、もっと簡単な方法がある
0682ちっとも理解が進まねぇorz
2007/02/12(月) 00:19:26まだレベル1と2の間にの俺にはよくわからない気がするが、明日よんでみよう。
STMってなんじゃらほい。interopの小間使いか(ぉぃ)
0683デフォルトの名無しさん
2007/02/12(月) 09:14:29サブディレクトリの中身も取得するgetDirectoryContentsを書いたのだが
どうもコードに無駄があるように思える。
Haskellらしく簡潔に書くにはどう書いたらいいんだ?
--
module GetRecursiveContents (getRecursiveContents) where
import System.Directory
import Data.List
getRecursiveContents :: FilePath -> IO [FilePath]
getRecursiveContents p = do cs <- getDirectoryContents p
result <- mapM (getRecursiveContents' p) $ filter (not . isSuffixOf ".") cs
return $ concat result
getRecursiveContents' :: FilePath -> FilePath -> IO [FilePath]
getRecursiveContents' p c = do let newPath = mergePath p c
dir <- doesDirectoryExist newPath
if dir then getRecursiveContents newPath
else return [newPath]
mergePath :: FilePath -> String -> FilePath
mergePath a b
| "\\" `isSuffixOf` a = a ++ b
| otherwise = a ++ "\\" ++ b
0684デフォルトの名無しさん
2007/02/12(月) 09:43:53bだろ。
同期を取るには二つ方法があって、MVarという古典的な共有変数を使っても良いし、
STMという仕組みでロックなしに共有状態を操作しても良い。
STMはちゃんと使ったことがないけど、たぶん次のような特徴がある。
・MVarでできることはなんでもできる。
・明示的にロックをエミュレートしたりしない限り、デッドロックを気にする必要がない。
・(どの程度か知らないが)遅い。
詳しくは、リファレンスや、そこからたどれる論文を読んでくれ。
0685デフォルトの名無しさん
2007/02/12(月) 12:24:50再帰の深さの指定をつける時を考えると、ツリー構造定義する方が早い気がする
import Monad
dirrec :: FilePath -> IO [FilePath]
dirrec p = do
cs <- getDirectoryContents p
let paths = [ p' ++ c | c <- cs, not ("." `isSuffixOf` c) ]
dirps <- mapM doesDirectoryExist paths
zipWithM dive dirps paths
where
p' = addYen p
where
addYen "\\" = "\\"
addYen [c] = c : "\\"
addYen (c:cs) = c : addYen cs
dive False = return
dive True = fmap concat . dirrec
0686685
2007/02/12(月) 12:47:59型が合っても動作が違う
(...)
fmap concat $ zipWithM dive dirps paths
(...)
where
dive False p = return [p]
dive True p = dirrec p
0687デフォルトの名無しさん
2007/02/12(月) 13:04:43getRecursiveContents :: FilePath -> IO [FilePath]
getRecursiveContents fp
= getDirectoryContents fp >>= mapM (fx fp) >>= return . concat
where
fx :: FilePath -> FilePath -> IO [FilePath]
fx bp "." = return [bp]
fx bp ".." = return []
fx bp f = do let np = bp ++ ('/':f)
b <- doesDirectoryExist np
if b then getRecursiveContents np
else return [np]
0688ちっとも理解が進まねぇorz
2007/02/12(月) 14:27:04ありがと。
どうせ同期を取るのは数秒に一回〜1秒に数回程度で、別に遅くてもいいから
STM使ってみるよ。ghc6.2では使えないんだよね。
0689デフォルトの名無しさん
2007/02/12(月) 14:28:38getRecursiveContents fp = liftM concat $ mapM f =<< getDirectoryContents fp
where
f "." = return []
f ".." = return []
f name = getRecursiveContents path `catch` \e -> return [path]
where
path = fp ++ "/" ++ name
doesDirectoryExistが気持ち悪かったので書き直してみたが、
今度は例外を握りつぶしていて良くない。
「inappropriate type」だけ選択的にcatchするにはどうすれば良いんだろう。
0690デフォルトの名無しさん
2007/02/12(月) 21:47:250691683
2007/02/12(月) 22:38:10がんばってソース読んでみる。
「あるディレクトリ以下の全てのログファイル
(拡張子固定)をすべて集計」ってのをやりたかったんだが
意外とめんどいコードが要るのな。
0692デフォルトの名無しさん
2007/02/12(月) 23:35:190693デフォルトの名無しさん
2007/02/13(火) 00:04:560694デフォルトの名無しさん
2007/02/13(火) 00:16:42素人は引っ込んでいてもらえますか?
0695デフォルトの名無しさん
2007/02/13(火) 00:25:50俺が何か間違ったことをいったか?
例えば、getDirectoryContentsにもっと短い名前を与え、
ファイルパス操作関数を用意するだけで、>>683みたいなコードはずいぶん書きやすくなる思うが。
0696デフォルトの名無しさん
2007/02/13(火) 00:45:53よく使うような関数は用意しといてってのには同意。
0697デフォルトの名無しさん
2007/02/13(火) 01:07:09思った通り素人だ。
CかJavaのプログラマだろうな。
しかも学生。
推測は当たってたか?
0698デフォルトの名無しさん
2007/02/13(火) 01:28:02うざい
0699デフォルトの名無しさん
2007/02/13(火) 01:59:40気持ちよく書き込んでいたところすまないね。
ここはそういう話をする所じゃないんだよ。
関数名が長いだとか短いだとか、ハンガリアンがどうのこうの、コメントはこうかきましょうだの、
ここの常連はそういう話はとっくに聞き飽きてるの。
0700698
2007/02/13(火) 02:11:06695 ではない.
必要ない書き込みでスレを無駄に消費しているお前がうざいだけ.
これも無駄なレスではあるが.
お前の無駄な書き込みがこのスレから消えてくれることを切に願う.
0701デフォルトの名無しさん
2007/02/13(火) 03:22:57> これも無駄なレスではあるが.
わかっていて書かずにはいられないとは、リアル厨房か?
どうせ何も本質を理解していないんだろう?
半年ロムってろよ。
0702デフォルトの名無しさん
2007/02/13(火) 08:42:382chで「素人は引っ込んでろ」って、馬鹿?
むしろ玄人様が学会にでも行けよ。
0703デフォルトの名無しさん
2007/02/13(火) 12:34:09興奮してるのと、摩訶不思議な2ch観を持ってるのは十分に伝わってくるけど、
文章全体としては何が言いたいのかさっぱりわからない。
0704デフォルトの名無しさん
2007/02/13(火) 13:59:52elispもHaskellもよくわからないけど
haskell-indent.el l.319 の :trype を :type にするとエラーは出なくなった
0705693
2007/02/13(火) 18:44:48>関数名が長いだとか短いだとか、ハンガリアンがどうのこうの、コメントはこうかきましょうだの、
俺だってソフトウェア工学の話がしたいわけじゃない。
>>691が言っているような単目的のコードを快適に書き散らすには
関数名の長さは重要だと思っているから、そう書いた。
それから、判り難かったかもしれないが、>>693は>>692へのレス。
0706デフォルトの名無しさん
2007/02/13(火) 23:02:550707デフォルトの名無しさん
2007/02/13(火) 23:36:34結局生産性悪いと思うんだけどどうだろ
Lisp系みたいなマルチパラダイム言語が一番使いやすいなぁ
0708698
2007/02/13(火) 23:48:280709デフォルトの名無しさん
2007/02/13(火) 23:50:42今の段階ではね。
でも、まだ研究が煮詰まってないから何とも言えないな。
0710デフォルトの名無しさん
2007/02/13(火) 23:50:43Haskellでなんちゃらエンジンみたいなの作る場合、
他の言語と比べてけっこういいもんができるそう?
0711デフォルトの名無しさん
2007/02/13(火) 23:53:280712デフォルトの名無しさん
2007/02/14(水) 00:05:22とか。
むろんケースバイケースだけども。
0713デフォルトの名無しさん
2007/02/14(水) 00:18:33Haskellみたいに関数型と手続き型が普通に使えれば十分だと思ってしまうんだが、
そうでもないものなの?
0714デフォルトの名無しさん
2007/02/14(水) 01:40:350715デフォルトの名無しさん
2007/02/14(水) 02:03:12なんでこんなにコンパイル遅いの?
だれのせい?
頭のいい奴がつくってこの出来?
0716デフォルトの名無しさん
2007/02/14(水) 02:47:05Cコンパイラと比べてないか?
言語仕様がどれだけ複雑か考えただけでも遅くなるのは当然だろ
0717デフォルトの名無しさん
2007/02/14(水) 02:56:370718デフォルトの名無しさん
2007/02/14(水) 03:10:020719デフォルトの名無しさん
2007/02/14(水) 03:28:07言語仕様が複雑だからだろ。
0720デフォルトの名無しさん
2007/02/14(水) 03:52:540721デフォルトの名無しさん
2007/02/14(水) 03:57:330722デフォルトの名無しさん
2007/02/14(水) 06:16:390723デフォルトの名無しさん
2007/02/14(水) 06:24:24要は、
・ 言語仕様が高速なコンパイルに向いているかどうか
・ 最適化をどのくらいやっているか
・ コンパイラのコードが洗練されているか
とかの問題。
0724デフォルトの名無しさん
2007/02/14(水) 09:45:34>・ コンパイラのコードが洗練されているか
はともかく
> ・ 言語仕様が高速なコンパイルに向いているかどうか
は、高速なコンパイルができる→機械語との対応が簡単→言語仕様が簡単、
って言わないのかな‥‥
0725デフォルトの名無しさん
2007/02/14(水) 10:34:11ってことじゃないかなぁ。
Dの場合、「コンパイラ実装に優しい言語仕様」というのをはっきり掲げてるわけだけど、
それは通常の会話に出てくる「シンプルな言語仕様」というのとは、指しているものが
だいぶ異なっているような気がする・・・。
0726デフォルトの名無しさん
2007/02/14(水) 11:27:04スクリプト言語みたいに実行できるDが異常
0727デフォルトの名無しさん
2007/02/14(水) 21:24:06おい、カスども聞いてくれ
ようやくまともにHelloWorldが書けるようになった高卒の俺が
圏論勉強してみっかーと思ってWikipedia読んでみたんだ
http://ja.wikipedia.org/wiki/%E5%9C%8F%E8%AB%96
アホだろこの説明はw
翻訳がおかしいというか、書いてる奴が説明する気ゼロなんだよ
そもそも「圏論」とか書くから難しそうなんだ
「カテゴリー論」にすれば、すっげー簡単そうなイメージになるのに
あと「圏」のページでは「定義域」、「余定義域」とかいう意味不明な用語がでてくるが、
「射」のページでは「ドメイン」、「コドメイン」と翻訳してある
用語を統一してないのはWikipediaの特性上しょうがないけど、
ドメインって訳したほうが100倍イメージしやすいよな
円周率を3とするよりも、3.14として難しくしたほうが、学習上、良いのはわかる
けど、圏論の説明はあまりにもひどすぎる
頭が悪いとしか思えない
ということで、AAで圏論 Coming soon!
0728デフォルトの名無しさん
2007/02/14(水) 21:59:17「カテゴリー」みたいな一般的な用語であっても、
専門用語と分かるように難しい言葉を当てることが多い。
一方、情報化学では、カタカナのまま使うことが多いので、
その辺、語感に温度差があるように思える。
"Categories for Working Programmers" みたいなのが
あると、なかなか楽しい気はする。
> AAで圏論 Coming soon!
期待してるぜ!
0729デフォルトの名無しさん
2007/02/14(水) 22:11:11wktk!!
0730デフォルトの名無しさん
2007/02/14(水) 22:12:330731デフォルトの名無しさん
2007/02/14(水) 22:45:54圏論を勉強してやっているのだが、定義4までは理解できるが、
肝心のモナドが出てくる定義5と6が意味不明だ。
天才エスパーが3行で解説してプラトンのイデア界のモナドに俺を接触させろ!おねがい (ぅふ
0732デフォルトの名無しさん
2007/02/14(水) 22:54:400733デフォルトの名無しさん
2007/02/14(水) 23:09:56ttp://www.ipsj.or.jp/07editj/promenade/4703.pdf
浪人の先生 これでございあす。
前半は糞クイズでございやすが、後半がモナド入門でやす。
4と5の間には越えられない壁がw
おねがいするお!
0734デフォルトの名無しさん
2007/02/14(水) 23:44:33The Haskell Programmer's Guide to the IO Monad ― Don't Panic
http://stefan-klinger.de/files/monadGuide.pdf
こんなの?
0735デフォルトの名無しさん
2007/02/15(木) 00:11:393行で説明するのは俺には無理.
まず定義5.これは実際に手を動かすと見えてくるので,
具体例でやるのが良いと思う.以下はその pdf にもある例.
1. リスト函手
・型 A に対し T A は A のリストを作る:
T A = [A]
・関数 f :: A -> B に対し T f :: [A] -> [B] は次の関数を作る:
T f = map f
・μ_X は X 型のリストのリストをならして X 型のリストを作る:
μ_X = concat
・η_X は X 型の値 x からそれだけからなる [X} 型のリスト [x] を作る:
η_X = singleton = (:[])
これらを図に代入して,ちゃんと可換になることを確認するよろし.
0736デフォルトの名無しさん
2007/02/15(木) 00:18:092. Maybe函手
・型 A に対し T A は Maybe A を作る:
T A = Maybe A = Just A | Nothing
・関数 f :: A -> B に対し T f :: Maybe A -> Maybe B は
(T f) (Just a) = Just (f a)
(T f) Nothing = Nothing
・μ_X は Maybe (Maybe X) を Maybe X にする:
μ_X (Just (Just x)) = Just x
μ_X (Just Nothing) = Nothing
μ_X Nothing = Nothing
・η_X は X の値 x を (Just x) にする:
η_X x = Just x
0737デフォルトの名無しさん
2007/02/15(木) 00:49:19drop 5もreverseもnullも自然変換で、
map succやallは自然変換でないと。
前者は構造のみを扱い、後者は要素が絡んでいることを反映しているのか。
これ考えた奴は天才だな。
0738デフォルトの名無しさん
2007/02/15(木) 00:50:211. リスト函手.これはありがたみが分かりづらい.
・f* = flatten . map f
2. Maybe函手.
・f* = Just . f
Maybe がこれでハッピーなのは,次の具体例を考えると分かる:
「バッグからアドレス帳を取り出し,
今日誕生日の人を探し,携帯電話を取得する」
これを関数合成で次のように書けるとうれしい:
getPhone . findBornToday . getAddressbook
ただ,各関数の自然な型は
getAddressbook :: Bag -> Maybe Addressboo(もってないかも)
findBornToday :: Addressbook -> Maybe Person(いないかも)
getPhone :: Person -> Maybe Phone(もってないかも)
なので合成ができない.そこで,* を使って
getPhone* . findBornToday* . getAddressbook
と書いてやると型があってハッピー.Haskell ではこれを
getPhone <<= findBornToday <<= getAddressbook
と書けるようになってる.
0739デフォルトの名無しさん
2007/02/15(木) 01:06:12が、『μが結合則、ηが恒等元の役割をする』というところがピンとこない。
なにとぞ、悟りの光をお与えください。
0740デフォルトの名無しさん
2007/02/15(木) 01:29:09左側の図で上側を通る計算はμを中置記法で書き,
TμT = T と簡約しないでおくと
T T T A --> (TμT) T A --> (TμT)μT A
となる.同様に下側を通る計算は
T T T A --> T (TμT) A --> Tμ(TμT) A
となる.これが(任意の A について)等しいのだから,雰囲気は
(TμT)μT = Tμ(TμT) …代数で言うところの結合則
「恒等元」という意味:
右側の図で左側の三角形の真ん中を通る計算は
ηT = T T と簡約しないでおくと
T A --> ηT A --> ημT A
右側の三角形の真ん中を通る計算は
T A --> Tη A --> Tμη A
これが恒等写像 id_TA に等しいのだから,雰囲気は
ημT = Tμη = T …代数で言うところの恒等元,単位元
0741デフォルトの名無しさん
2007/02/15(木) 03:45:58dクス 結合法則のほうは分かったw 中置記法が味噌かよwww
中置記法で書くと確かに結合側に見えるw
麻呂は前置記法で書いていたので、どう見ても結合法則ではなく可換を意味しているようにしか
見えなかったでおじゃるw
恒等元のほうは、まだ分からんw
ηだけで恒等元?? (ημ)で恒等元?
でもサ変と右辺でημとμηでひっくり返っているし
もう3行ばかり解説頼むw
0742デフォルトの名無しさん
2007/02/15(木) 07:50:31一般に,二項演算 * に対して e が恒等元であるとは
任意の a に対して e * a = a * e = a を満たすことを言う.
μを中置記法で読めば,最後に出てくる式はこれと同じ.
0743デフォルトの名無しさん
2007/02/15(木) 09:20:05凄い! なんかわかった気になる。
そうか、μをfunctor間の演算とみなせばよかったのか。
ところで>738の例で
Maybe functorがf* = Just . f
とあるけど、これでfindBornToday*が
Addressbook -> Maybe Person
から
Maybe Addressbook -> Maybe Person
になるんだろうか?
fをもちあげないといけない気がするんだが…
0744デフォルトの名無しさん
2007/02/15(木) 10:25:48そのとおりで,こちらのミス.手抜きをしたのがいけなかった.以下が正しい.
f* (Just x) = Just (f x)
f* Nothing = Nothing
0745デフォルトの名無しさん
2007/02/15(木) 10:35:570746デフォルトの名無しさん
2007/02/15(木) 18:09:27lispよりも強力なのがhaskellってことでいいのでしょうか?
強力というのは最小限の手間で複雑な処理がかけるという意味で
0747デフォルトの名無しさん
2007/02/15(木) 18:40:24迷ったなら両方やっとけば。
Lispは風呂敷。なんでもリストでつつんでしまう。良く言えば柔軟。悪くいえば節操がない。
Haskellはディナー用食器セット。テーブルマナーがわかっていれば心地良い。
0748デフォルトの名無しさん
2007/02/15(木) 18:56:11>Haskellはディナー用食器セット。テーブルマナーがわかっていれば心地良い。
でも調理は自分で、でも何故かアレルギー反応する人がいるのがおもしろい。
0749デフォルトの名無しさん
2007/02/15(木) 19:59:31HaskellのMonadって、実はKleisliの方が近いんじゃないか、と思うんだけど、
何でMonadと呼ばれているんだろう?
(T,η, *)と(M, return, flip (>>=))が対応してるのに対して、(T, η, μ)とは
間接的にしか対応してないのに。Monadなんて使わなければ関連する定義
も1つ減って幸せな気がする。
0750デフォルトの名無しさん
2007/02/15(木) 22:08:19群 →対象の集まり
圏 →対象と射の集まり
これで認識あってる?
0751デフォルトの名無しさん
2007/02/15(木) 22:21:000752デフォルトの名無しさん
2007/02/15(木) 22:30:13数学の用語としてだったら、群は間違ってる。
群は、可逆な演算の定義された集合の事(厳密な言い方でないけど)。
例えば、整数の集合に足し算と引き算を定義すれば、群である。
圏は一応あってると言っていいと思う。
0753デフォルトの名無しさん
2007/02/15(木) 22:33:50集合という言葉の定義がわからん
0754デフォルトの名無しさん
2007/02/15(木) 22:39:020755デフォルトの名無しさん
2007/02/15(木) 22:40:220756デフォルトの名無しさん
2007/02/15(木) 22:48:49でも、やっぱりよくわからのだがこれ一体なんの役に立つんだ?
0757750
2007/02/15(木) 22:50:040758デフォルトの名無しさん
2007/02/15(木) 22:55:56一般にプログラミング上の専門用語は、
「寓意的・即物的」であることが好まれるからだろう。
"Kleisli" なんていう、
どう読めばよいのかも分からない人名をつけるよりも、
"Monad" なんて単語のほうがずっとイメージしやすいしね。
この特徴は、プログラミングが「科学」ではなく、
まさに「工学」であることの証拠のように思える。
ていうか、ここら辺はむしろ「科学」のほうが異常なんだと思う。
発見者(又は、偉大な業績を残した先人達)の学問上の
功績を称えるために、発見したものに対して
その人の名前を冠する、という悪しき慣習のために、
新しい概念に対して本当にふさわしい名前をつけることが
出来てないんだよ。
0759756
2007/02/15(木) 22:56:08なるほど。
でも、だとしたらコストが高すぎる。一体どれだけ時間かかるんだ。
ていうか、いい加減コーディングスタイル確立してくれ。
というわけで偉い人がんばってくれ。
0760デフォルトの名無しさん
2007/02/15(木) 23:01:46Haskell改名要求キター
0761デフォルトの名無しさん
2007/02/15(木) 23:02:08data Set
= Empty
| Pair Set Set
| Union Set
| Infinity
| Replacement Fun Set
| Power Set
こんな感じ?
0762デフォルトの名無しさん
2007/02/15(木) 23:06:59確かにHaskellって名前あんまり良くないかも。
0763デフォルトの名無しさん
2007/02/15(木) 23:09:07"Haskell" 自体は「専門用語」ではないから桶。
あれは「固有名詞」であって、云わば商品名のようなもの。
どんな名前をつけようが関係ない。
0764デフォルトの名無しさん
2007/02/15(木) 23:12:46そっか、HaskellのMonadと圏論のMonadは別物だったのか…ちょっと驚き
0765デフォルトの名無しさん
2007/02/15(木) 23:12:480766デフォルトの名無しさん
2007/02/15(木) 23:39:550767デフォルトの名無しさん
2007/02/15(木) 23:40:59dクス!! 定義5までは理解した気がするぉ!(^ω^)v
(T μ η) が (対象 演算子 単位元)か。 しかし対象 T は T 1個だけか?
実は理解してないか?(^ω^;)?
定義6についてはこれからエロ画像見ながら考えるぉ
0768デフォルトの名無しさん
2007/02/15(木) 23:44:10μ、ηは自然変換。
0769デフォルトの名無しさん
2007/02/16(金) 00:28:35モノイドとしてみた場合の話だぉ。
0770デフォルトの名無しさん
2007/02/16(金) 01:03:24モノイドとしてみるならTは集合としてみるべき。
0771デフォルトの名無しさん
2007/02/16(金) 01:46:57すごく大雑把に言うと,チューリングマシンや
λ計算などがあったところに,新しい定式化として
圏論に基づくものが現れたという背景がある.
現在,普通のプログラマはチューリングマシンや
λ計算を知らなくても特に問題は起きないけれど,
それと同じようなものだと考えるのが順当だと思う.
(もちろん知ってたほうが良いのは確かだけど,
とりあえず大雑把なところを抑えておけば十分.)
ラーニングコストが高いのは,まだ新しい理論である
ということと,従来の手法よりも数学的に取り扱いやすい
枠組みとして導入されたことがあるので,教育用に
整理されてない現段階では,好きな人がやるものだと
思ったほうがよいと,個人的には思う.
0772デフォルトの名無しさん
2007/02/16(金) 01:56:04別物というとちょっと語弊があって,
Kleisli triple と monad は一対一対応するので,
どちらで定義しても「本質的には同じもの」になる.
言い方としては,
Haskellでは monad は Kleisli tripleで定義される
というのが間違いないと思う.
0773デフォルトの名無しさん
2007/02/16(金) 02:06:17まだまだ未開拓なのか・・・。
>>772
>Kleisli triple と monad は一対一対応するので,
>どちらで定義しても「本質的には同じもの」になる.
!!ですよね。
0774デフォルトの名無しさん
2007/02/16(金) 02:45:29/:::| ___| ∧∧ ∧∧
/::::_|___|_ ( 。_。). ( 。_。)
||:::::::( ・∀・) /<▽> /<▽>
||::/ <ヽ∞/>\ |::::::;;;;::/ |::::::;;;;::/
||::| <ヽ/>.- | |:と),__」 |:と),__」
_..||::| o o ...|_ξ|:::::::::| .|::::::::|
\ \__(久)__/_\::::::| |:::::::|
.||.i\ 、__ノフ \| |:::::::|
.||ヽ .i\ _ __ ____ __ _.\ |::::::|
.|| ゙ヽ i ハ i ハ i ハ i ハ | し'_つ
.|| ゙|i〜^~^〜^~^〜^~^〜
0775デフォルトの名無しさん
2007/02/16(金) 02:52:320776デフォルトの名無しさん
2007/02/16(金) 03:09:000777デフォルトの名無しさん
2007/02/16(金) 04:22:40おれは、参加できないが。
0778デフォルトの名無しさん
2007/02/16(金) 11:52:48射の合成則なのか?
対象に順番に射が作用しているという点で、結合則を利用しているようには見えないんだが?
ちんぷんかんぷんだぜ
0779デフォルトの名無しさん
2007/02/16(金) 13:40:190780デフォルトの名無しさん
2007/02/16(金) 15:02:44>>778
「射の合成則」は monad ではなく圏の性質なので
これを落とすと圏論で議論ができなくてうれしくない.
Monad を Kleisli triple (T,η,*) で定義したとき,
どれが利いているのかと言うと「全部そろって意味がある」
という答えになってしまう.
では,どんな意味があるのかというと,標語的に言えば,
「monad は『計算』をモデル化できる構造」
となる.これはもう少し説明すると η, * が実際にどう働くかが
見やすくなるので,せっかくだから Haskell の計算をモデル化してみる.
0781デフォルトの名無しさん
2007/02/16(金) 15:09:47定義もいくらか怪しいけれど,イメージということで許していただきたく.
>>778
例として
sqr x = x * x,dup x = 2 * x
という関数を考え,sqr (dup 3) という『計算』を考えてみる.
いわゆる手続き言語ではこの式は
sqr (dup 3) = sqr 6 = 36
と『計算』を次々と『値』に潰していくので
型は常に整合しているんだけど,Haskell では
sqr (dup 3) = (dup 3) * (dup 3) = ...
『計算』そのものを『計算』していく.これは sqr の型を
考えるとちょっと奇妙.だけど monad (T,η,*) を
T:X を「X を返す『計算」にうつす函手
η:『値』をその値を取り続ける『計算』にする自然変換
*:『値』を取る『計算』から『計算』をとる『計算』への変換
と定義してやり,sqr (dup 3) が本当は
sqr* (dup* (η3))
を意味していると思うと,きれいに理解できる.
(この η, * は Kleisli triple の条件を満たしている.
ほかの計算モデルでも η, * は同じような役割を果たすので
Kleisli triple の条件が必要なのが理解できる)
0782デフォルトの名無しさん
2007/02/16(金) 20:16:29おお、何だか凄そうな人が!
いくつか質問させてください。
(1)
> T:X を「X を返す『計算」にうつす函手
> η:『値』をその値を取り続ける『計算』にする自然変換
> *:『値』を取る『計算』から『計算』をとる『計算』への変換
という定義から、
> この η, * は Kleisli triple の条件を満たしている.
は必ず言えるのでしょうか? 上の定義は型に関してKleisli tripleの条件を満たす+ηが自然変換
ということだと思うのですが、「ηが自然変換」ということからKleisli tripleの3条件が出てくるのでしょうか?
(2)
Kleisli tripleの3つめの条件
g* o f* = (g* o f)*
の直感的な意味はなんでしょう?
(3)
λ計算はCCCで普通に解釈できるのにsqr x = x * x,dup x = 2 * xになると
Kleisli categoryが必要になるのは、名前があるからでしょうか?
0783デフォルトの名無しさん
2007/02/17(土) 01:44:14Haskellの旦那!ありがとう、かなり理解がすすんだぉ(Vipperなりに)。
>>733の定義6でKleisliトリプレットがモナドを為す事も、そこからKleisliカテゴリをだす事も
示せた(と思う ^ω^;)。
T μ (T μ T) = T μ (T*・T) = T*・(T*・T)
(T μ T)μ T = (T*・T)μ T = (T*・T)*・T
こんな感じで射だけを先に色々合成できるので、遅延評価を記述するのに便利
という風に納得したぉw
sqr* (dup* (η3)) = (sqr* ・ dup)* ・ (η3)
こんな風に使える?みたいな?
0784デフォルトの名無しさん
2007/02/17(土) 01:50:55泣き顔に見える
0785デフォルトの名無しさん
2007/02/17(土) 02:07:030786デフォルトの名無しさん
2007/02/17(土) 03:20:06レスポンスがおかしい。
0787デフォルトの名無しさん
2007/02/17(土) 03:44:06(1) 普通の計算の定義を採用すると,きちんと証明できる.
(満たさない計算もあるだろうけれど,直感に反する気がする)
ηが自然変換であることは Kleisli triple の条件に含まれている.
(2) 『計算』の合成が,直感と整合することの保証.
右辺が何を意味してるかを考えると,左辺が出る.
(3) その式くらいなら CCC で解釈できるんだけど,それは本当に
「自然」な解釈なの? ということで Kleisli でやることを
考えたそうな.なお,λ計算を monad で解釈するためには,
Kleisli + CCC + 整合性みたいな構造が必要.
0788デフォルトの名無しさん
2007/02/17(土) 08:42:430789デフォルトの名無しさん
2007/02/17(土) 09:44:29合成演算子とIdの条件を示した、ってことなのかな。
で、圏を構成すると、合成について閉じることと結合法則は保証されるから嬉しい。
まあ嬉しいが、弱い嬉しさだなあ…。
0790デフォルトの名無しさん
2007/02/17(土) 10:26:39技術的には自然変換でないと monad の有用な性質が
成立しないので困る,ということがある.
概念的には自然変換の自然っぷりに関連するんだけど,
ηは『値』を『計算』として解釈しなおすだけなんだから,
それが自然変換にならないわけがない.
というのが自分の持ってるイメージ.
0791デフォルトの名無しさん
2007/02/17(土) 10:30:47って結合法則?
なんとなく、自然変換にしとくと、添字を省略した等式変形が出来るというイメージが
0792デフォルトの名無しさん
2007/02/17(土) 10:55:45有用な性質はたくさんあって,例えば結合法則を含む性質
として「monad と代数が一対一対応する」という定理がある.
ほかにもいくつもの定理や普遍性が成立する.
もちろん自然変換自体が扱いやすいのもそうですね.
0793デフォルトの名無しさん
2007/02/17(土) 11:12:37記号の定義は>>733に引用されているPDFに書いてある。
ジンマシンが出そうな式だが。
0794デフォルトの名無しさん
2007/02/17(土) 12:17:53意味は存在しない。というより意味をつけてしまうとダメだ。
なんのためにモナドにまで抽象化したんだって話になる。
個々のモナド(Maybe,List)とかに落とせば意味はつけられるからそこを考えたほうがいい。
0795デフォルトの名無しさん
2007/02/17(土) 18:02:050796デフォルトの名無しさん
2007/02/17(土) 19:43:20函手 F 上の monad と G 上の monad が与えられたとき,
合成函手 F G 上の monad を構成することが合成に相当する.
合成には複数の方法があることも,全く存在しないこともある.
0797デフォルトの名無しさん
2007/02/17(土) 20:38:44(T1, η1, *1) = ([], \x->[x], \f->\xs->map f xs)
MaybeのKleisli tripleが
(T2, η2, *2) = (Maybe, Just, \f->\x->case x of { Just v->f v; _-> Nothing })
とすると
ListとMaybeの合成は
(T3, η3, *3) = (T1 . T2, η1 . η2, *1 . *2)
にはなりそうもないね…
0798デフォルトの名無しさん
2007/02/17(土) 22:03:30Kleisli Triplet に関して、手続き型言語へのアナロジー表現で意味を考えてみた。
総本家カテゴリ: 引数:A (値型) 返り値:B(値型) 関数: f:A→B (値型→値型)
元祖カテゴリ: 引数:A (値型) 返り値:TB(参照型) 関数: f:A→TB (値型→参照型)
↓ 関手 η:Id → T (Idは値型を保つ、Tは参照型を意味する。)
分家1カテゴリ Id: 引数:A(値型) 返り値:TB(参照型) 関数: f:A→TB (値型→参照型)
分家2カテゴリ T: 引数:TA(参照型) 返り値:TB(参照型) 関数: f:TA→TB(参照型→参照型)
次に * は、値型引数の関数を参照型引数の関数に変換する演算子とみなす。
f:A→TB、 f*:TA→TB の意味は、同じ関数fの、それぞれ(値型引数A、参照型返り値TB)
バージョンと(参照型引数TA、参照型返り値TB)バージョンに相当する。
Kleisli Triplet が満たすべき3つの性質の、この表現での意味。
・η*_A = Id_A の意味は、値型引数を参照型にする関手ηの引数の型を、*が参照型にするのだから、
η*_Aは、参照型の引数TAが、そのままになる恒等変換 Id_A
・f* 。η_A = f の意味は、値型引数を参照型引数にして、参照型バージョンの関数に
突っ込んだ結果と、引数が値型のバージョンの関数に突っ込んだ結果が同じになること。
・g* 。f* = (g* 。f)* の意味は、参照型引数バージョンの関数f*,g*を合成するのと、
値型引数バージョンfと参照型引数バージョンの関数g*を合成
した上で、その合成関数の引数を値型から参照型に変えたものは同じ物。
0799デフォルトの名無しさん
2007/02/17(土) 22:21:44・対象Cは値型変数と参照型変数
・関数 f は値型引数→参照型返り値、関数 f* は f の参照型引数、参照型返り値バージョン
・恒等写像η_A とは、値型変数を参照型変数へ変える関数。
(ηが関数 f に作用すると、f ⇒ f* の変換をする演算子)
・二つの関数 f と g の合成が、g* 。f になるのは、fが吐くのは参照型の返り値だから
g は参照型の引数をとる g* バージョンでないと困るから。
となる?
これは、アトムを値型、リストを参照型とみなしたリストモナドと等価かな?(^ω^?
0800デフォルトの名無しさん
2007/02/18(日) 11:24:350801デフォルトの名無しさん
2007/02/18(日) 11:53:020802デフォルトの名無しさん
2007/02/18(日) 11:56:06ネタにマジレスいくないとおもうけど
モナドじゃなかったら何を使えばよかったと思う?
0803デフォルトの名無しさん
2007/02/18(日) 12:40:55副作用を許す
無駄に副作用をなくすのにこだわりすぎ
0804デフォルトの名無しさん
2007/02/18(日) 12:46:15結局、どれだけ細かく型を付けるかによるトレードオフだよな。
俺は別扱いするのがコストに見合うと思うが。
0805デフォルトの名無しさん
2007/02/18(日) 12:46:57OOPL同様ピュアを反面教師としてハイブリッド型が生まれるのだ。
0806デフォルトの名無しさん
2007/02/18(日) 12:51:37そういう話じゃない。
藻などを使うのが理想的かどうかってことだろ。
0807デフォルトの名無しさん
2007/02/18(日) 12:54:19関数型な人には関数的じゃないといわれる
IOモナドの何と不憫なことか
0808デフォルトの名無しさん
2007/02/18(日) 13:11:090809デフォルトの名無しさん
2007/02/18(日) 13:11:550810デフォルトの名無しさん
2007/02/18(日) 13:49:100811デフォルトの名無しさん
2007/02/18(日) 14:21:23バルバロイはすっこんでろ!
0812デフォルトの名無しさん
2007/02/18(日) 16:17:190813デフォルトの名無しさん
2007/02/18(日) 16:53:02海草なども使えばいいってことですか?
0814デフォルトの名無しさん
2007/02/18(日) 22:07:240815デフォルトの名無しさん
2007/02/18(日) 22:28:200816デフォルトの名無しさん
2007/02/18(日) 23:24:26Haskelになんとなく関わっていることで自分が賢くなったと思い込みたい人間が大半だからな。
その事実をはき違えて、スレの流れを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こんなところで質問する程度のやる気では無理
0821デフォルトの名無しさん
2007/02/19(月) 17:35:02その質問に対して現状においてもっとも適切に答えをくれる場所
あるだろ・・・。
0822デフォルトの名無しさん
2007/02/19(月) 18:02:06IOモナドは他のモナドとちがって
随伴使ったモナドと解すべきなんだと思う。
つまり
普通のモナド: Maybe, List, etc..
随伴で構成されたモナド: IOモナド
IOモナドで全部副作用と名のつくものを一括で処理しているのが
いろいろな鯨飲の元なんだと思う。
IOモナドを役割ごとにもっと分割させないと。
本当にIOモナドはI/Oだけ扱えばいいんだと思う。
0823デフォルトの名無しさん
2007/02/19(月) 18:02:53○原因
0824デフォルトの名無しさん
2007/02/19(月) 18:49:00この本ですか?
http://www.cis.upenn.edu/~bcpierce/tapl/index.html
0825デフォルトの名無しさん
2007/02/19(月) 18:50:02psファイルがあるのですね
http://www.let.uu.nl/esslli/Courses/barr-wells.html
0826デフォルトの名無しさん
2007/02/19(月) 19:55:30函手F上のモナドってなんだ?
あんまりよくわかっていないことを言わないほうがいい。
モナドは函手じゃなくて圏の上で構成される構造だ。
だから「自己」函手なわけだよ。
0827デフォルトの名無しさん
2007/02/19(月) 19:56:52すまん。訂正。どんどんいってけーーーー。
俺もよくわかってないし。
0828デフォルトの名無しさん
2007/02/19(月) 20:52:05> 随伴で構成されたモナド: IOモナド
これってどういう意味?
IO monad = (IO, η, μ)
のIOが、何かの左 or 右随伴になってるってこと?
Listだって集合の左随伴だと思うが…
0829デフォルトの名無しさん
2007/02/19(月) 20:53:18集合へのforgetful functorの随伴ね
0830デフォルトの名無しさん
2007/02/19(月) 21:20:57モナド (F,η,μ) で,特に F を明示したい場合に "monad over F" という
言い方をすることがあるので,それほど変ではないと思うよ.
0831デフォルトの名無しさん
2007/02/19(月) 21:34:40こういう話に追いつけるのはいつになることやら。
0832デフォルトの名無しさん
2007/02/19(月) 22:05:34!!!
マジで!ちょっとまてわからん。orz
orz
0833デフォルトの名無しさん
2007/02/19(月) 22:09:08あー。早とちり。
>のIOが、何かの左 or 右随伴になってるってこと?
そういう意味じゃない。どういう意味かと聞かれたら
そこを現在勉強中です。
うまく答えれません。正直そんなナチュラルに答え返されるとは思わなかった。
0834デフォルトの名無しさん
2007/02/19(月) 22:16:50モナドと随伴は一対一対応する.
(随伴が与えられると,そこからモナドが構成できる.逆に,
任意のモナドに対して,それを構成するような随伴が存在する)
よって IO に対してそれに対応する随伴があるのは当然.
ということを言おうとしてると思って,IO の随伴を求めたけど
全然直感的でないものしか得られなかった.
これって何か解釈あるのかな? 参考文献お願いします.
0835833
2007/02/19(月) 22:18:07ちょうどそれを考えられる材料がそろってきたので。
期待しないでください。
0836デフォルトの名無しさん
2007/02/19(月) 23:30:53それともどれかがより大きな記述力があるの?
なんで圏論なのさ?チューリングマシンでは駄目なのかよ!
チューリングがホモだからって差別してんじゃないわよ!
0837デフォルトの名無しさん
2007/02/20(火) 00:02:47コンマ圏がマンコ圏に見えて困るでしょ?
0838デフォルトの名無しさん
2007/02/20(火) 01:50:36モナドを構成する随伴は一般に複数あってそのうちの一方の端が Eilenberg-Moore の
構成でもう一方の端が Kleisli の構成、だよね。
端というのはある圏の始対象と終対象という意味で。
0839デフォルトの名無しさん
2007/02/20(火) 02:46:29今の最強はhaskellでしょうか?
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
この人達が絶賛するlispのマクロに対応する機能も
haskellは持ってるのでしょうか?
0840デフォルトの名無しさん
2007/02/20(火) 02:49:250841デフォルトの名無しさん
2007/02/20(火) 14:18:13Haskellにはマクロはない。
Lispのことは良く知らないけど、記述力という点で
Haskellより弱いとは思えない。
0842デフォルトの名無しさん
2007/02/20(火) 14:55:200843デフォルトの名無しさん
2007/02/20(火) 15:35:07第一級の関数とかマクロとかパターン照合とかが使えるかどうかが大きいと思う。
0844デフォルトの名無しさん
2007/02/20(火) 16:14:12それは記述力とは関係なくて、エラー抑制の効果があるだけ。
0845デフォルトの名無しさん
2007/02/20(火) 18:53:11その結果、Lispの方がちょっとHaskellよりも記述力が高いのですよ。
でも、多くの場面では、カチカチの型が憑いているメリットの方が大きいと思うけれど。
0846デフォルトの名無しさん
2007/02/20(火) 19:30:22Data.Dynamicを使える訳で、そうしないのは気持ちの問題に過ぎないのかも。
型安全でないHaskellライブラリなんて寒気がする、とか。
0847デフォルトの名無しさん
2007/02/20(火) 20:01:39マクロをエラー抑制だけと言い切るのはちょっと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メタな要素がまざると、型とか意味論的に都合が悪いのかな
0849デフォルトの名無しさん
2007/02/20(火) 22:41:560850デフォルトの名無しさん
2007/02/20(火) 22:43:040851デフォルトの名無しさん
2007/02/20(火) 23:01:37LispのevalはLispの世界で定義されている。
この差は大きいと思う。
0852デフォルトの名無しさん
2007/02/20(火) 23:02:53性的なほうがいいね!
0853デフォルトの名無しさん
2007/02/20(火) 23:11:08きつい方が気持ちよい
0854デフォルトの名無しさん
2007/02/24(土) 00:52:28圏論の基礎は数学者向けの基礎なので、
普通の人は違う本を読んだほうがいいらしい。
0855デフォルトの名無しさん
2007/02/24(土) 01:58:15これから初心者の俺が朝まで生Haskellやろうかと思うんだけど
おまえら実況板並みに教えてくれないか?
0856855
2007/02/24(土) 06:05:170857デフォルトの名無しさん
2007/02/24(土) 09:34:02ワロタ
0858デフォルトの名無しさん
2007/02/24(土) 17:37:24だってだれもレスくれねーんだもん
バベル見て寝たわ
0859デフォルトの名無しさん
2007/02/24(土) 18:05:10夜中の2時にいきなりでレスも糞もねーだろw
VIPじゃねーんだぞwwww
昼間に犯行予告をしとけよ
0860デフォルトの名無しさん
2007/02/24(土) 18:43:300861デフォルトの名無しさん
2007/02/24(土) 19:01:360862デフォルトの名無しさん
2007/02/25(日) 02:59:15∩___∩
|ノ⌒ ⌒ ヽ
/ ●) ●) |
Let's | ( _●_) ミ Haskell♪
彡、 |∪| 、`
/ ヽノ ヽ
/ 人 \\ 彡
⊂´_/ ) ヽ__`⊃
/ 人 (
(_ノ (_)
0863デフォルトの名無しさん
2007/03/03(土) 00:14:49い ま か ら ハ ス ケ る か ら お し え て く れ
0864デフォルトの名無しさん
2007/03/03(土) 00:36:300865デフォルトの名無しさん
2007/03/03(土) 00:41:35Map関数までしかすすんでないんだけど、
いきなりWikiつくりはじめちゃうぞーー
0866デフォルトの名無しさん
2007/03/03(土) 01:00:05ちょwwwそれ無謀wwwwwww
0867デフォルトの名無しさん
2007/03/03(土) 02:24:520868デフォルトの名無しさん
2007/03/03(土) 02:29:12基礎を勉強したところでコードは書けるようにならないじゃない
なんか作ろうとしたほうが5倍くらい早くおぼえれる
そうだろ?父さん!
0869デフォルトの名無しさん
2007/03/03(土) 02:54:28君が一番上達する方法はしらないから、自由にすればいいよ。
0870デフォルトの名無しさん
2007/03/03(土) 02:57:200871デフォルトの名無しさん
2007/03/03(土) 09:58:100872デフォルトの名無しさん
2007/03/03(土) 12:54:390873デフォルトの名無しさん
2007/03/03(土) 16:31:01Haskellでそれができるとしたら「型」の概念に対して
相当鋭敏な感覚を持ってないとむつかしいような気がする。
javascriptとかだったらなんとなく見よう見まねで動きそうな気もするが。
0874デフォルトの名無しさん
2007/03/04(日) 00:46:42import 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こんな書き方できるの初めて知った
0876デフォルトの名無しさん
2007/03/06(火) 23:57:05こういうプログラムをつくってみようと思い立ってもまったく書けない
あれ?文法どうだったっけ?みたいな
0877デフォルトの名無しさん
2007/03/07(水) 00:13:36手続き型言語で培った慣れが役に立ちにくいというだけであって、
学習の難しさはさほど変わらないんじゃなかろうか。
初めてプログラミングを習った人は大抵、
「思い立っても全く書けない」状態を経験するだろう。
0878デフォルトの名無しさん
2007/03/07(水) 10:43:060879デフォルトの名無しさん
2007/03/07(水) 20:46:20ふつうのHaskellプログラミングでMAP関数のとこまでは読んだ
0880839
2007/03/07(水) 21:28:52cのプリプロセッサを強引に前処理としてかませば
lispのマクロと同じことができるかも
0881デフォルトの名無しさん
2007/03/07(水) 21:36:550882デフォルトの名無しさん
2007/03/07(水) 21:37:05テキストファイルの各行を30文字に切り詰めるプログラム。
0883デフォルトの名無しさん
2007/03/07(水) 21:39:07Cプリプロセッサは実質的にチューリング完全だから能力は十分だけど、
Haskellの方がメタなことをするのに適していないような気がする。
例えば、局所的に型を宣言することができないとか。
0884デフォルトの名無しさん
2007/03/07(水) 22:49:05>Cプリプロセッサは実質的にチューリング完全だから能力は十分
これってホント?ループがかけないような
0885デフォルトの名無しさん
2007/03/07(水) 22:49:530886デフォルトの名無しさん
2007/03/07(水) 22:50:390887デフォルトの名無しさん
2007/03/07(水) 23:20:390888デフォルトの名無しさん
2007/03/07(水) 23:46:56ところで、どうもまだ混乱しているんですが、自己includeのループをどう止
めたものかがわりません。 ifdef とかで何とかなるもんなの? define の再
定義では上手く行かないと思うんだけど。
たとえば階乗を計算するコードって、どんな概形になりますか?
# スレ違いすぎ?
0889デフォルトの名無しさん
2007/03/07(水) 23:48:14でループはできる
0890839
2007/03/07(水) 23:55:48http://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適当だけどこんなん用意して
#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俺が念頭に置いてたのはこんな感じ。
http://lists.boost.org/Archives/boost/att-46646/lambda.cpp
>>885
let data Foo = ... in ...
のように式の中で即席の型を作れると、C++のテンプレートの
真似ができるかと思ったが、良く考えるとそうでもなかったかも。
0893879じゃない
2007/03/08(木) 01:49:32でも、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お疲れさん。
>あと、全部メモリに読み込んでから処理するのはいいんでしょうか(関数型だとそれがキレイ?)
hGetContentsは全部メモリに読んでる訳じゃなく、入力は遅延する。
これはこれで気持ち悪い(副作用と紙一重)けど、便利なことは間違いない。
0895デフォルトの名無しさん
2007/03/08(木) 02:18:49import System
main=getArgs>>=readFile.head>>=mapM_ putStrLn.take 30.lines
0896893
2007/03/08(木) 02:25:45ありがとうございます!
Stringの値が必要になったら全読みされちゃわないんですか?
Stringのケツが必要になるまでは遅延される?
>>895
1行キタ─(゚∀゚)─!!!! まさに関数型!!!
関数合成ってそう使うんですね。初めてしっくり来ました。
0897893
2007/03/08(木) 02:55:18main=getArgs>>=readFile.head>>=(\c->mapM_ (putStrLn.take 30)$lines c)
にしないと、>>882の動きになりませんでした。
このラムダは消せないのでしょうか…?
0898デフォルトの名無しさん
2007/03/08(木) 05:30:36main = getArgs>>=readFile.head>>=putStrLn.unlines.map (take 30).lines
とやる。
0899デフォルトの名無しさん
2007/03/08(木) 06:30:58main = getArgs >>= readFile . head >>= mapM_ (putStrLn . take 30) . lines
ちょっと分かりづらいか・・・。
0900デフォルトの名無しさん
2007/03/08(木) 09:28:14よって実現できるのはプッシュダウンオートマトンであってTuring機械ではない
(外部スクリプトで複数回CPPをかけていいんならTuring完全になる)
ただしC++ templeteを使っていいならTuring完全になる
0901839
2007/03/08(木) 09:37:55http://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:58Boost だけど template を使ってるわけじゃないんだね。
漠然と、シンボルを結合したりしているのかな、とは思っていたが、うまい方法が思いつかなかったよ。ありがとう。
0904デフォルトの名無しさん
2007/03/08(木) 10:38:50>>892のリンク先のコード(β簡約器)はincludeを使っていない。
見れば分かるけど、λ式を最大nステップ簡約するマクロはO(log n)個のdefineで書ける。
だから「実質的に」チューリング完全、と書いた。
http://pc11.2ch.net/test/read.cgi/tech/1068359871/
完全にすれ違いなのでレスがあればこっちによろしく。(適当なスレが見付からなかったので)
0905デフォルトの名無しさん
2007/03/08(木) 10:55:04Boostを語れゴラァ part3
http://pc11.2ch.net/test/read.cgi/tech/1158991211/
0906デフォルトの名無しさん
2007/03/08(木) 12:15:39最後は、mapM_の部分適用…と思って、小一時間悩みました。
最後は、(mapM_ (putStrLn . take 30)) . lines と評価されるんですね。
結合順位重要。関数適用最強…と。 _〆(。。)
0907デフォルトの名無しさん
2007/03/08(木) 16:12:460908デフォルトの名無しさん
2007/03/08(木) 23:48:49まぁまぁ面白いな
0909デフォルトの名無しさん
2007/03/09(金) 03:49:25知らなかった…。初心者にはあり難い。
0910デフォルトの名無しさん
2007/03/09(金) 12:39:44を -ddump-parsed つけてコンパイルしてみたら(GHC6.6)
==================== Parser ====================
main = (readLn >>= print) . ((1 +))
って表示されたんだが、このパースは間違ってる。
実際、これをコンパイルすると型のミスマッチのエラーが起きるし。
本来は
main = readLn >>= (print . (1 +))
とパースされるわけで、実際処理系自体はそのようにパースしてるはず。
0911デフォルトの名無しさん
2007/03/09(金) 13:05:50main = a >> b || c && d == e : f + g * h ^ i . j
に対しては
main = ((((((((a >> b) || c) && d) == e) : f) + g) * h) ^ i) . j
となった。どうも、演算子の結合強度を全く考慮していないらしい。
といっても、演算子の結合強度はパースしてみないと分からないので仕方ない。
0912デフォルトの名無しさん
2007/03/09(金) 13:11:300914デフォルトの名無しさん
2007/03/11(日) 12:39:27GHC 6.6 Windows環境で上記ソースをUTF-8にして実行してみたんですが、
出力ファイル(a.txt)の中身が「S?kao」となってしまいます。
日本語を正しく出力するにはどうすればいいんでしょう?
0915デフォルトの名無しさん
2007/03/11(日) 12:42:46変換が要る。
>>402-414あたり参照。
0916デフォルトの名無しさん
2007/03/11(日) 13:11:16だれか直してパッチ送りつけろ。
0917デフォルトの名無しさん
2007/03/11(日) 14:21:50これに応募するとか。
0918914
2007/03/11(日) 15:47:50どもです。IOの標準ライブラリがUTF-8対応されたわけじゃないのですね。
日本語がどうしても必要な時はWinHugs使ってみます。
こちらはこちらでアンインストールできないバグがありますが・・・。
0919デフォルトの名無しさん
2007/03/12(月) 00:09:240920デフォルトの名無しさん
2007/03/12(月) 00:18:430921デフォルトの名無しさん
2007/03/12(月) 00:52:280922デフォルトの名無しさん
2007/03/12(月) 01:27:08でもリファレンスには載ってない。System.Posix.*は載ってるのに。
0923デフォルトの名無しさん
2007/03/12(月) 02:44:10それは違うんじゃないか?
> * String/ByteString/UTF8String/UTF16String as filename
まあファイル名にも使えて然るべきだけど。
0924デフォルトの名無しさん
2007/03/13(火) 16:39:59コード変換が実装されない一番の原因は、今のGHCのIOライブラリが拡張しにくい
構造になっていることだから、それをまずなんとかするのが先決だ。
で、なんとかしようというのが>>917の提案だろう。
枠組さえできれば、コード変換を実装する事自体は難しくない。
0925デフォルトの名無しさん
2007/03/13(火) 23:15:59おまえらWindowsでHaskellしてんの?
Linuxの場合、Fedoraはいろいろ対応してるぽいが、
Debian系のUbuntuは使用不可能?
0926デフォルトの名無しさん
2007/03/14(水) 02:00:13いつのまにか書き換えられてるな。
・Various encodings (UTF8,UTF16...) for text files
もリンク先に増えてる。うしゃ。
しかし、
class Stringable a where
length :: a -> Int
concat :: [a] -> a
....
instance Stringable String
instance Stringable ByteString
instance Stringable UTF8String
instance Stringable UTF16String
なの?個々の文字はどうするんだ?
Charに32ビット使ってるのにUnicode(UCS4)のコードポイントそのまま使うんじゃないの?
つうか、リストじゃないの?そんなのありえるの?
0927デフォルトの名無しさん
2007/03/14(水) 15:05:25>個々の文字はどうするんだ?
http://darcs.haskell.org/SoC/fps-soc/Data/Stringable.hs
には、
class Stringable a where
...
head :: a -> Char
tail :: a -> a
...
というメソッドがある。
>Charに32ビット使ってるのにUnicode(UCS4)のコードポイントそのまま使うんじゃないの?
>つうか、リストじゃないの?そんなのありえるの?
何が言いたいか全然分からんw
もうちょっと詳しく。
0928デフォルトの名無しさん
2007/03/14(水) 15:50:23自分でコンパイルするとか
0929デフォルトの名無しさん
2007/03/14(水) 19:59:59Haskellの型推論って中の人どんなふうに動いてんの?
Javaにはそんな機能ないけど、
例えばプリミティブ型もIntegerとかにして、
ぜんぶをObject型で扱えば、なんでも突っ込めるようになるはずだけど、
それとはまったく違う?
0930デフォルトの名無しさん
2007/03/14(水) 20:36:44型推論と多相型をごっちゃにしてないか?
型推論は純粋にコンパイル時の操作で、一旦型が推論されたら、
明示的に型を書いた場合と全く同じようにコンパイルされる。
多相型の実装の話なら、その通りで、Javaのオブジェクトと同様あらゆる型をポインタを介して扱っている。
0931デフォルトの名無しさん
2007/03/14(水) 20:44:47関数を返す関数が見当たらなかった?ような気がする。
Lisp 等だと普通に lambda を返す様な事をするけど、
0932ごめん。
2007/03/14(水) 20:57:49カリー化された関数は作成してるけど、
無名関数を明示的に返す関数は無かったような気がする。
そんなのはあんまり書かないのかな?
0933デフォルトの名無しさん
2007/03/14(水) 21:09:44無名関数を明示的に返すくらいなら、最初からカリー化を利用して
引数を導入しておいた方が楽だからじゃないだろうか。
ただし、すでに名前の付いている関数を返すことはときどきある。
f :: Int -> Int -> Int -> Int
f 0 = (+)
f 1 = (-)
f 2 = (*)
とか。これの延長で無名関数を返すこともあるだろう。
f 3 = \x y -> if y == 0 then 0 else div x y
0934デフォルトの名無しさん
2007/03/15(木) 00:52:08勘違いしてたらスマンけど…。
Stringable aは、Stringable aであって[Char]じゃない
→リストじゃない→リストを扱う関数が使えないのでは?
UTF8Stringとかってエンコーディング処理が隠蔽されてるんだと思うけど、
今のStringの置き換えにするには、単純な[Char]に比べて性能遅そうな気が。
あと、エンコーディング毎に型が別ってのは、正しいのかも知れないけど、
コンパイル後に対応エンコーディングを増やすってどうやるの?
っていうか、ByteStringってエンコーディングは何?
と、疑問が山ほど。
0935デフォルトの名無しさん
2007/03/15(木) 11:29:25>Stringable aは、Stringable aであって[Char]じゃない
>→リストじゃない→リストを扱う関数が使えないのでは?
その通り。ただし
toString :: (Stringable a) => a -> String
fromString :: (Stringable a) => String -> a
は簡単に書ける。
>UTF8Stringとかってエンコーディング処理が隠蔽されてるんだと思うけど、
>今のStringの置き換えにするには、単純な[Char]に比べて性能遅そうな気が。
速度が多少犠牲になったとしても、空間効率が[Char]よりずっと良い。
[Char]だとGHCでは一文字あたり約20バイト必要だけど、UTF-8配列なら1〜4バイトで済む。
>あと、エンコーディング毎に型が別ってのは、正しいのかも知れないけど、
>コンパイル後に対応エンコーディングを増やすってどうやるの?
UTF*StringはあくまでStringの代替としての内部コードで、Stringの場合と同様に
入出力時にコード変換する使いかたが想定されているんだと思ったが、ちょっと自信がない。
>っていうか、ByteStringってエンコーディングは何?
本来のByteString(Data.ByteString.ByteString)はWord8の列なのでエンコーディングは関係ない。
ここで問題になってるのはたぶんData.ByteString.Char8.ByteStringで、これはLatin-1。
0936デフォルトの名無しさん
2007/03/15(木) 12:13:27まじですか。
Charのデータ自体は4バイトだから、
リストノードひとつに16バイトも必要なの?
でも、ポインタひとつ4(or8)バイト食えばそんなもん…か?
>UTF-8配列なら1〜4バイトで済む。
UTF-8なら1〜6バイトではないかと。まあ20バイトの比ではないが。
0937デフォルトの名無しさん
2007/03/15(木) 12:28:16enter : 4bytes -- クロージャ進入関数へのポインタ
Char : 4bytes -- headへのポインタ
String : 4bytes -- tailへのポインタ
Char
enter : 4bytes
Char# : 4bytes -- コードポイント値
計20bytes
確かめたわけじゃないけど、これで実測と合う。
>UTF-8なら1〜6バイトではないかと。
Unicodeの範囲(0..0x10ffff)なら4バイト以下で表せる。
0938デフォルトの名無しさん
2007/03/15(木) 12:56:40Stringable.hsにはtoString, fromStringじゃなくて、toList, fromListが定義されてるのでわざわざ書く必要すらない。
名前が違うだけで型は全く同じ。
>>934
対応エンコーディングを増やすためには適当なデータ型を用意してStringableクラスのインスタンスにしてやればよい。
おおざっぱにはこんな感じ。
data MyString = MyString ByteString
instance Stringable MyString where
empty = MyString empty
head (MyString bs) = (bsから先頭1文字分取り出してChar型の値にして返す処理)
...
0939デフォルトの名無しさん
2007/03/15(木) 13:16:51それはわかるけど、リストで使うときとStringableで使うときで
バンバンそんな変換してたら遅いじゃん?
メモリ節約どころの騒ぎじゃないじゃん?
> 対応エンコーディングを増やすためには適当なデータ型を用意してStringableクラスのインスタンスに
そう言う事じゃなくて、プログラムとして、エンコーディングをpluggableに出来ないじゃんと。
例えば、Stringable を使って作られたエディタが配布されてるとする。
そのエディタに対して、対応エンコーディング追加プラグインみたいのが作れないのでは、という事。
あるいはプラグインでなくてもいい。
そのエディタ作者は英語しか出来ずStringableで書いても、入出力はLatin-1しか考えてない。
で、これを作者が存在すらしらない、SJISString, EUCJPString, Big5String みたいのを扱えるようにするには、
どうすればいいの?毎回ソース書き換えてリコンパイル?
0940デフォルトの名無しさん
2007/03/15(木) 14:04:02mapとかfoldrとかいった操作は効率の良い定義に置き換えることも出来るようになってる。
pluggableに関しては、今のStringable.hsはそういう作りになってないんだから、書き換えてリコンパイルするしかないじゃん。
0941デフォルトの名無しさん
2007/03/15(木) 14:11:15>バンバンそんな変換してたら遅いじゃん?
リストとして使いたいなら従来どおりStringを使えば良い。
そのためのinstance Stringable String。
0942デフォルトの名無しさん
2007/03/15(木) 17:41:28Stringable用の便利なライブラリがあるとき、
変換せずに両方混在させて使える?
pluggableは、String以前に、Haskellでそもそも可能なの?
コンパイル時に知らないsubtype(クラスのインスタンス)を、
動的にファーストクラス値で指定してロードってできるんだっけ?
0943デフォルトの名無しさん
2007/03/15(木) 17:49:20>Stringable用の便利なライブラリがあるとき、
>変換せずに両方混在させて使える?
使える。Stringはリストであると同時にStringableなので。
0944デフォルトの名無しさん
2007/03/15(木) 18:25:47いわゆるダイヤモンド継承問題はどうなってるんだろう?
0945デフォルトの名無しさん
2007/03/15(木) 18:49:020946デフォルトの名無しさん
2007/03/15(木) 21:16:410947デフォルトの名無しさん
2007/03/15(木) 23:51:15話の流れからして、StringじゃなくてUTF8Stringとかでそれが出来るかって話だと思うが。
0948デフォルトの名無しさん
2007/03/16(金) 00:36:24どこをどう読むとそういう話になるんだ?
ともあれ、UTF8Stringはリストじゃないので、リスト操作関数は使えない。
0949デフォルトの名無しさん
2007/03/16(金) 02:05:56クロージャ進入関数って?
データが関数のポインタを保持するの?
0950デフォルトの名無しさん
2007/03/16(金) 02:08:59UTF8StringとかのStringableな型ではmap,take,foldrとかのリスト操作的な関数がデフォルト定義として与えられている。
だけどPreludeの同名の関数たちとは型が違うから、単にimport Data.Stringableとすると衝突してしまう。
なので、実際に使う時はimport qualified Data.Stringable as S みたいにして、
Stringable用の関数は S.map, S.take, S.foldr のようにS.を付けて使うことで衝突を回避する。
0951デフォルトの名無しさん
2007/03/16(金) 02:40:48Haskellではデータ構造の一部が未評価のことがあり得るので、
評価用の関数ポインタを保持せざるを得ない。
>>950
基本的な関数はStringableクラスにもあるけど、
リストにしか対応していないライブラリも多い(例えばParsecとか)。
「リスト操作関数」という言い方が悪かったか。
0952デフォルトの名無しさん
2007/03/16(金) 03:03:53っていうか、Stringableとリストのクラスを作るんだよね?(:)とかheadとかtailとか++とか!!とか。
それでも現行のリスト用ライブラリは使えないけど、じきに対応してくれるのを待つ、と。
でも構文的な問題が厳しいか。
0953デフォルトの名無しさん
2007/03/16(金) 03:29:21>Parsecが使えない文字列なんて…。
何を問題視しているのかさっぱり分からん。
従来ファイル名にはStringしか使えなかったのを、Stringableのインスタンスならどれでも
使えるようにしよう、という互換性を保った拡張であって、Stringで満足しているなら
Stringを使いつづければ良いんだが。
0954デフォルトの名無しさん
2007/03/16(金) 03:56:390955デフォルトの名無しさん
2007/03/16(金) 09:22:14遅そうだけど
0956デフォルトの名無しさん
2007/03/16(金) 09:32:26extendedList cons nil match = (forth, back)
where
forth = unfoldr match
back = foldr cons nil
0957デフォルトの名無しさん
2007/03/16(金) 18:18:58非Latain-1 リストベースライブラリでの使用
String × ○
Stringable ○ ×
望まれる物 ○ ○
例えば、(メモリ効率の改善はなくなるが)
バイト列とStringの変換関数だけを提供するという解も有り得るかと。
あるいは、Stringableの方向性でいくなら、
Stringableをリストの「インスタンス」にするか、それが無理なら
リストとStringableを包含したクラスを作って、リストの構文でも扱えるようにすれば、
リストベースライブラリもわずかな修正とリコンパイルだけでStringableでも使用できるようになるのでは?
0958デフォルトの名無しさん
2007/03/16(金) 19:26:12・Stringという型とStringableというクラスを比較するのはおかしくないか?
・Stringでも非Latin-1の文字は使える。
俺ならこういう表にする。
Parsec(リストのみ) 現行IO(Stringのみ) 提案IO(Stringable)
String ○ ○ ○
UTF8String × × ○
[Word8] ○ × ×
>>917のリンク先の提案は、「IO」という縦の列の改善提案であって、
例えばUTF8StringがParsecで使えるかどうかとは関係ない話だと思うが。
「リスト的なコンテナ」を表現する型クラスがあっても良いとは思うけど、
それは少なくとも>>917とは別の話題だと思う。
0959デフォルトの名無しさん
2007/03/17(土) 03:53:19それはともかく、
・Haskell(Hugs/GHC)自体は、FPSは関係なく、ちゃんと
CharにUnicodeコードポイントを(1byteずつに分けずにまるごと)入れて、
readFileとかputStrとかが適切にデコード・エンコードしてくれる方向
・FPSは、それとは直交して、
効率の良いString(able)クラスを作ろうとしていて、
エンコーディングも扱う
と理解してOK?
しかし、せっかく作るStringableだが、
Parsecなどのリストベースのライブラリで使えないというのは、勿体ないとは思わない?
リスト派とStringable派にライブラリが分裂しちゃうじゃん。無駄じゃん。
文字エンコーディング機能が、
readFileとかの関数と、Stringableのインスタンスの両方に実装されるのも
DRYじゃないし、テキストを扱う流儀の分裂を招く。
0960デフォルトの名無しさん
2007/03/17(土) 10:09:28http://hackage.haskell.org/trac/summer-of-code/ticket/59
0961デフォルトの名無しさん
2007/03/17(土) 12:27:33>とすると、>>917が>>914-916とは別の話題だったということか。
いや、>>917はGHCのIOライブラリを作りなおそうという話であって、Stringableの提案は
その一部に過ぎない。ので全体としては関係あると思う。
>しかし、せっかく作るStringableだが、
>Parsecなどのリストベースのライブラリで使えないというのは、勿体ないとは思わない?
>リスト派とStringable派にライブラリが分裂しちゃうじゃん。無駄じゃん。
確かに。
>文字エンコーディング機能が、
>readFileとかの関数と、Stringableのインスタンスの両方に実装されるのも
>DRYじゃないし、テキストを扱う流儀の分裂を招く。
これは仕方ないような。readFileがやるのは
外部エンコーディング <-> 内部エンコーディング
の変換で、例えばUTF8Stringが行うのは内部エンコーディング間の変換。
0962デフォルトの名無しさん
2007/03/17(土) 15:46:20(:)とか[]は
Stringableじゃ使えないのか。
0963デフォルトの名無しさん
2007/03/17(土) 16:09:480964デフォルトの名無しさん
2007/03/17(土) 16:25:48リストを使った実装群と、Stringableを使った実装群に分断される。
将来絶対、混乱や重複実装の元になって問題になるだろ。どうにかしろよ。
0965デフォルトの名無しさん
2007/03/17(土) 16:29:230966デフォルトの名無しさん
2007/03/17(土) 16:37:470967デフォルトの名無しさん
2007/03/17(土) 16:42:27>>944=Tucker!
C++が最高だと思って相手構わず噛み付く痛い人だから
相手にしなくておk
monadic programming の主旨も理解できてないレベル
0968デフォルトの名無しさん
2007/03/17(土) 16:42:50使えるのか?
同名の関数があるってオチは無しだぜ?
0969デフォルトの名無しさん
2007/03/17(土) 17:30:30一応リストっぽい操作を持つ型構築子クラスとしてはData.Foldableってのがある。GHC 6.6で追加された。
ただ、これを使ってUTF8StringをFoldableのインスタンスにすることはできない。
なぜならUTF8Stringは型であって型構築子ではないから。
一旦type UTF8String = UTF8StringC Charみたいなものを考えて
UTF8StringCをFoldableのインスタンスにすることは出来るだろうけど、それってどうなんだろう。
0970デフォルトの名無しさん
2007/03/18(日) 03:55:42: と [] は言語仕様の方に手を入れるしか。
[]は単なる糖衣としても、 : は?
0971デフォルトの名無しさん
2007/03/18(日) 09:58:34それだと、UTF8StringC Doubleなんていう型を作れることになるな。
まじめにリストをクラス化するとしたらこうだろう。
class List container element | container -> element where
nil :: container
cons :: element -> container -> container
match :: container -> Maybe (element, container)
...
で、
instance List [a] a
instance List UTF8String Char
...
しかし、これってやるに値することなのかな。
型クラスを介して操作するなら、コストの点ではリストに変換してしまうのと大差ないような。
0972デフォルトの名無しさん
2007/03/18(日) 10:24:52> class List container element | container -> element where
関数従属って全然使ったことないから思いつかなかったな。
0973デフォルトの名無しさん
2007/03/18(日) 11:47:290974デフォルトの名無しさん
2007/03/18(日) 11:54:27どういうコードを書いているかにもよるが、Haskellじゃなくて
お前が糞である可能性も十分にあると思う。
特に、コードが簡潔なのに書くのに時間がかかる場合、
不慣れなだけな可能性が高いかと。
0975デフォルトの名無しさん
2007/03/18(日) 12:06:33馬鹿はJavaでもやってろwwwwww
0976デフォルトの名無しさん
2007/03/18(日) 14:36:27>型クラスを介して操作するなら、コストの点ではリストに変換してしまうのと大差ないような。
Stringableも型クラスじゃん。違うの?
どうせ型クラスなら、分断と混乱を防いだ方が良いと思うけど。
0977デフォルトの名無しさん
2007/03/18(日) 15:21:01それぞれの型に最適化した定義で上書きできるからあんまり問題ないと思う。
0978デフォルトの名無しさん
2007/03/18(日) 15:58:03>Stringableも型クラスじゃん。違うの?
だから俺は今のままのStringableなら要らないんじゃないかと感じている。
>どうせ型クラスなら、分断と混乱を防いだ方が良いと思うけど。
何か混乱してないか?
*型*が乱立すると確かにまずい。ライブラリAが型Tを使い、
ライブラリBがTと似た型T'を使い、しかもTとT'が相互変換できないなら、
AとBとの間に互換性がない訳で、早急に解決すべき問題だ。
一方、*型クラス*の乱立はそんなに深刻じゃない。
ライブラリAがクラスCを使い、ライブラリBがクラスC'を使ったとしても、
CとC'の両方のインスタンスであるような型Uがあれば、Uを使って
AとBを併用できる。つまり相互運用性が保たれる。
型クラスの乱立はない方が良い(コードの重複を招くので)けど、
できてしまったものはしかたないし、躍起になって防ごうとするほどのものでもないと思う。
例えば、提案通りIOライブラリにStringableが採用されたとする。
これでUTF8StringをIOライブラリで使えるようになるが、まだParsecでは使えない。
さらに将来のある時点で、Parsecが>>971のようなクラスを採用したとする。
これでUTF8StringがIOでもParsecでも使えるようになる。
でも、このとき、Stringableを使って書かれたコードを変更する必要はない。
StringableクラスとListクラスは共存できる。
こういう風に、クラスは後付けでもなんとかなるのが特徴だと思う。
0979デフォルトの名無しさん
2007/03/18(日) 16:00:09HaskellというかGHC?で、この辺どうなのか全然知らないけど。
まあ、Stringableも型クラスなら変わらないから関係ないと思うけど。
誰か、>>971を連中に提案してくれよ。
Stringable should be "List', othewise it shall bring about a civil war in Haskell applications.
みたいな。
でも、>>971じゃ、[] 記法や : でのマッチが解決しないな。
これをStringableでも使えるようにしないとあかんな。
0980デフォルトの名無しさん
2007/03/18(日) 16:05:020981デフォルトの名無しさん
2007/03/18(日) 16:09:42解説ありがとう。
>こういう風に、クラスは後付けでもなんとかなるのが特徴だと思う。
なるほど。急ぐ必要はないのか。
でも最初というか早い内からあった方が良いよね?共通クラス。
あと、リストの場合は型の問題(≒関数・演算子の問題)の他、
[]記法と : のマッチの問題があるんじゃない?
それもListクラス導入時に同時に解決すべき問題で急ぐ必要はないのかも知れないけど。
0982デフォルトの名無しさん
2007/03/18(日) 16:10:27何を批判しているのか明確にしてくれ。
リストを使うのを妨げるような変更は一切話題になっていないと思うんだが。
0983デフォルトの名無しさん
2007/03/18(日) 16:11:53>>981の
> []記法と : のマッチ
をStringableでも使いたいと言うことでは?
0984デフォルトの名無しさん
2007/03/18(日) 16:19:03をStringableでもやりたいって事かと。
実際、リスト処理はこれで書かれてると思うし。
ただ、[]は不要かな?新規にデータ構築する時だけだし、
文字列処理ではあんま使わないかも?リストが出来るだけで問題ないかも。
0985デフォルトの名無しさん
2007/03/18(日) 16:31:37>>971みたいなのを導入するならコードの書き換えが前提だと思ってたが。
0986デフォルトの名無しさん
2007/03/18(日) 16:35:29学習が全然進まない、という好例だな。
0987デフォルトの名無しさん
2007/03/18(日) 16:41:07共通クラスに準拠させるんならhead,tail,foldrとかを使って書いてねって話しになると思う。
hoge [] = []
hoge (x:xs) = fuga x : hoge xs
は
hoge = foldr fuga empty
もしくは
hoge = map fuga
でOK
0988デフォルトの名無しさん
2007/03/18(日) 16:45:11hoge = foldr (\x y -> cons (fuga x) y) empty
じゃないと型が合わない(^^;
0989デフォルトの名無しさん
2007/03/18(日) 16:51:08は、
データ構造の実装を直接触る、汚い・忌むべきコードなんだよ!
hoge xs = cons (fuga.head xs) $ hoge.tail xs
みたいにちゃんと関数で書くべきなんだ!!
もちろん、
bar Just a = foo a
bar Nothing = baz
もダメダメだ!!!
0990デフォルトの名無しさん
2007/03/18(日) 16:58:30それとも、>>989みたいな考え方を浸透させて、
hoge (x:xs) = fuga x : hoge xs
みたいのは非推奨にするの?言語として良い解なのかな、それ?
0991デフォルトの名無しさん
2007/03/18(日) 17:10:46MLに敗北するのか。
0992デフォルトの名無しさん
2007/03/18(日) 17:32:190993デフォルトの名無しさん
2007/03/18(日) 18:01:48仕様自体を変更しないと無理。
0994デフォルトの名無しさん
2007/03/18(日) 18:05:48もう文字列をリストで表現できるとか他言語に自慢できないのね
0995デフォルトの名無しさん
2007/03/18(日) 18:26:34痛いことを言ってる人がいるようだが……
関数型言語からパターンマッチを取ったら、データには関数を通してしかアクセスできなくなり
凡百のオブジェクト指向言語並みの地位に堕するだけだ。
0996デフォルトの名無しさん
2007/03/18(日) 18:30:020997デフォルトの名無しさん
2007/03/18(日) 18:32:000998デフォルトの名無しさん
2007/03/18(日) 18:42:090999デフォルトの名無しさん
2007/03/18(日) 18:42:191000デフォルトの名無しさん
2007/03/18(日) 18:42:5210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。