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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
haskell.org
http://www.haskell.org/

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

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

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

・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
2デフォルトの名無しさん: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/
3デフォルトの名無しさん: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/
4デフォルトの名無しさん:2006/11/07(火) 21:42:35
>>1
乙カリー
5デフォルトの名無しさん:2006/11/07(火) 22:47:22
スレタイこっちのがよかったな

【あらいぐま】関数言語Haskell Part6【ハスケル】
6デフォルトの名無しさん: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 [`ー'
7デフォルトの名無しさん:2006/11/07(火) 23:00:57
        ミンナデ ハースケルー♪
          ∧_∧   ∧_∧ ))
        (゙゙ヽ ゚∀゚)') ('(゚∀゚ /゙゙)
      ((  \    / ヽ    /
         ((⌒)  (   )  (⌒))
          ``ヽ_,)  (,__,ノ゙
8デフォルトの名無しさん:2006/11/07(火) 23:05:08
いいか、みんな
        (゚д゚ )
        (| y |)

Haskellで勉強すればokと信じていたのに、
いつまでたっても頭がよくならない。
    Haskell ( ゚д゚)  ok
       \/| y |\/

これらをくっつけて
        ( ゚д゚) haskellok
        (\/\/

逆から読むとこれ臭ぁ、というわけだ
        ( ゚д゚) kolleksah
        (\/\/

Haskellやってると、くさくなるということだな
        (゚д゚ )
        (| y |)
9デフォルトの名無しさん:2006/11/07(火) 23:20:08
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□■□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□■□□■□□□
□□□■□□□□■□□□□□□□□□□□□□□□□□□□□□□□□□■□□■□□□
□□□■□□□□■□□□□□□□□□■■■□□■□□□□□□□□□□■□□■□□□
□□□■□□□□■□□□□□□□□■□□□■□■□□□□□■■■□□■□□■□□□
□□□■■■■■■□□■■■□□□■□□□□□■□□■□■□□□■□■□□■□□□
□□□■□□□□■□■□□□■□□□■■■□□■□■□□■■■■■□■□□■□□□
□□□■□□□□■□■□□□■□□□□□□■□■■■□□■□□□□□■□□■□□□
□□□■□□□□■□■□□□■■□■□□□■□■□■□□■□□□■□■□□■□□□
□□□■□□□□■□□■■■□■□□■■■□□■□□■□□■■■□□■□□■□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
10デフォルトの名無しさん:2006/11/07(火) 23:34:03
前スレの998は死ね
11デフォルトの名無しさん:2006/11/07(火) 23:36:56
>>10
     ○ 
     ノ|) 
_| ̄|○ 「L


 ○、
   \、  ○ 
     ヾ \)ヽ
  _| ̄|  <
12デフォルトの名無しさん:2006/11/07(火) 23:39:07
  Haskellはじめて挫折して
  (( (`Д´) (`Д´)
   (/ /) (/ /) ))
   < ̄<  < ̄<

  帰ってこないやつがいる
  (`Д´) (`Д´) ))
 (( (\ \) (\ \) 
    > ̄>  > ̄>

 ハイ!!  ハイ!!  ハイ ハイ
.   ( `Д)_(Д´ )
.   ノ ノヽ |  |>
   /  >   < ヽ

     ハイッ!!
   (`Д´)_(`Д´)ノ
   ノ ノヽ |  |
.   ノ  >  < ヽ

  ハイ!あるある探検隊!
   (`Д´)ノ (`Д´)ノ
   <| ヘ|  <| ヘ|
    <    <

   あるある探検隊!
  ヽ(`Д´)ヽ(`Д´)
.    |,、 |>.  |,、 |>
      >   . >
13デフォルトの名無しさん:2006/11/07(火) 23:43:04
    ∧__∧      
    (`・ω・´)    Haskellについて語るスレではござるのか? 
   .ノ^ yヽ、     
   ヽ,,ノ==l ノ      
    /  l |       
"""~""""""~"""~""
14デフォルトの名無しさん:2006/11/07(火) 23:44:18

                             、ミ川川川川川彡,,
      え!?                   ミ          彡
                  l⌒l____l⌒三 ク .ハ  こ   三
         ∩___∩ /          三 マ  ス  こ   三
        /ノ      ヽ/ ●    ●  三  l  ケ は  三
        | ●   ●  i'   (_●_,,)  U .三  ? ル .ひ  三
        | (_●_)    彡   l U |    三     の  ょ  三
        ミ l U l  u   l    ヽ,_,,ノ     三    ス  っ  三
         >ヽ,,ノ     ゝ        ,,,;:三    レ  と   三
        /       /''      c-、 ,,,;;::::三       し  .三
       (二つ      /      (   ̄ ̄彡      て   三
         〉      ( ̄ ̄'')   `--──彡         .ミ
         /   、    >-─''          '川川|l|l |l|川川ミ
15デフォルトの名無しさん: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"
       \\     ノ | |\
16デフォルトの名無しさん:2006/11/07(火) 23:46:26
    \   ∩─ー、    ====
      \/ ● 、_ `ヽ   ======
      / \( ●  ● |つ
      |   X_入__ノ   ミ   関数言語なんかに釣られ、ク、クマ―――――!!
       、 (_/   ノ /⌒l
       /\___ノ゙_/  /  =====
       〈         __ノ  ====
       \ \_    \
        \___)     \   ======   (´⌒
           \   ___ \__  (´⌒;;(´⌒;;
             \___)___)(´;;⌒  (´⌒;;  ズザザザ
                          (´⌒; (´⌒;;;
17デフォルトの名無しさん:2006/11/07(火) 23:49:04




------ 以上テンプレ -----

18デフォルトの名無しさん:2006/11/08(水) 01:20:58
あらいぐまはPascalにくれてやれ也
19デフォルトの名無しさん:2006/11/08(水) 12:10:07
Aranskが復活したの?
20デフォルトの名無しさん:2006/11/08(水) 20:19:29
Aranskだけが馬鹿なわけじゃないと思うよ
21デフォルトの名無しさん:2006/11/11(土) 19:17:16
やっぱりweb上に日本語で読める入門文書の一つくらい
あった方がいいんだろうか。
2221:2006/11/11(土) 19:22:16
これだけじゃ意味不明だな。
「いっこうにHaskellがはやらないのを鑑みるに」を頭に付け加えてくれ。
23デフォルトの名無しさん:2006/11/11(土) 22:45:22
formal semanticsが整備されれば利用者も100万人くらい増えるはず。
24デフォルトの名無しさん:2006/11/11(土) 23:08:16
formal semanticsがあると何が嬉しいの?
25デフォルトの名無しさん:2006/11/12(日) 00:02:53
バグに遭遇したとき、プログラムのバグなのか処理系のバグなのかが明確になる
26デフォルトの名無しさん:2006/11/12(日) 00:20:50
>>25
自然言語で与えられるsemanticsではだめなのか?

それに、その用途に使うならHaskellで定義できないあらゆる関数(foreign importされたものとか)の
semanticsが必要になると思うんだが、それも要求しているの?
27デフォルトの名無しさん:2006/11/12(日) 00:43:00
Rubyやperlだって言語仕様 = 実装だしな。
実用的なスクリプト言語にsemanticsなど不要。
28デフォルトの名無しさん:2006/11/12(日) 00:55:23
最近のJavaのGenericsのバグ(?)も形式的意味論があれば防げたかもしれない。
http://d.hatena.ne.jp/sumii/20060928/1159403268
29デフォルトの名無しさん:2006/11/12(日) 10:23:05
形式的意味論なんて絵に描いた餅ですよ
30デフォルトの名無しさん:2006/11/12(日) 11:19:01
Haskellは絵に描いた理想を追う言語ではなかったのか
31デフォルトの名無しさん:2006/11/12(日) 11:24:07
>>28
形式的意味論もなにも、コンパイラとランタイムの
キャスト可否の判定が食い違ってるだけじゃん。

コンパイラ作成者がランタイムと違う実装してポカやっただけ。
本来なら A::compareTo(Object o) が呼ばれる。
ちょっとスレ違いですまん。
32デフォルトの名無しさん:2006/11/12(日) 11:29:20
JAVA言語は危険だというkとが証明されたんだな
33デフォルトの名無しさん:2006/11/12(日) 11:47:52
だな。c++のテンプレートよりかなりシンプルなのにこれだからな。
34デフォルトの名無しさん:2006/11/12(日) 12:00:42
>>30
違います。
そもそも理想って何ですか?
35デフォルトの名無しさん:2006/11/12(日) 12:14:07
数学者の理想じゃね?
36デフォルトの名無しさん:2006/11/12(日) 12:20:50
>>35
だからどんなのが理想なんだよ。
何か目的があってこそ理想があるんだろ?
37デフォルトの名無しさん:2006/11/12(日) 12:26:15
いや俺>>30じゃないからよく分からんし。
手続き型言語と比べて数式(数学者の脳内)に近いだろ?
だから数学者にとって理想的な言語。俺はそれくらいの意味で書いた。
38デフォルトの名無しさん:2006/11/12(日) 12:31:59
Haskellはもう理想を失った・・・
39デフォルトの名無しさん:2006/11/12(日) 13:11:46
実行時効率を犠牲にして言語を単純化しようとしているという点では
十分に理想主義的だと思うが。
文字列がコードポイントの遅延リストであるのがその一例。
40デフォルトの名無しさん:2006/11/12(日) 14:13:38
ただのバイトのリストじゃない?
マルチバイト文字をリストの1要素として扱えてる?
41デフォルトの名無しさん:2006/11/12(日) 14:43:59
>>40
Prelude> Char.ord maxBound
1114111
42デフォルトの名無しさん:2006/11/12(日) 14:51:05
GHC6.6で、
main = print $ "テスト" !! 1
でもいいか。ソースはUTF-8で。
43デフォルトの名無しさん:2006/11/12(日) 15:20:58
>>41
d。内部はUTF-16(的)なのね。

しかし、どうせならUCS4まで扱ってくれれば良いのに。
あんな「思ってたより多かったのでサロゲート作っちゃいました」
とかほざく連中に合わせる必要ないのに・・・。
44デフォルトの名無しさん:2006/11/12(日) 15:35:53
>>43
いや、1114111は0x10ffffで、16ビットの範囲を超えていて、
Unicodeの17面を全部表現できる。
UTF-16よりUTF-32に近いはず。
45デフォルトの名無しさん:2006/11/12(日) 15:50:10
Unicodeコンソ 2byte固定で全ての文字扱えるようにする。
ISO(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までしか扱えないソフトが出てくる ← 今ここ
46デフォルトの名無しさん:2006/11/12(日) 15:54:18
追記:今のUTF-16は可変長な。UTF-32と同じく0x10FFFFまで扱える。
47デフォルトの名無しさん:2006/11/12(日) 16:07:08
> UTF-16よりUTF-32に近いはず。
確かにイメージ的には32の方が近いね。実際どういう実装なのかは知らないけど。
内部表現は100進数だったりして・・・。
48デフォルトの名無しさん:2006/11/12(日) 18:34:50
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=RHG%C6%C9%BD%F1%B2%F1%3A%3A%C5%EC%B5%FE+Revolution%3A%3A%A4%D5%A4%C4%A4%A6%A4%CEHaskell%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0
># p.269 kind の訳語は「類」なのか、「種」なのか?
>
>    * ふつけるで使っている「類」は、nobsun の訳を元にしているんだろうけど……
>          o 数学辞典を調べて、出てきた用語を使ったような
>                + 「類」は "Class" じゃないの?
>    * Clean では「種」
>    * 型理論の方面では「種」が使われている
>    * というわけで、以後は「種」を使うことにしましょう

このスレの住人の意見を聞きたいんだが、kindの訳語として「類」と「種」のどっちを使うべき?
49デフォルトの名無しさん:2006/11/12(日) 18:59:42
種は「根源的には同じもの」(亜種,など)で
類は「似た性質/特徴を持つもの」(哺乳類,など)と個人的に思っている。

で、kindの "* -> *" と "*" の区別とかは
「似た特徴」とも言えるが、それ以上に「根源的な部分」を
表しているような気がするので「種」に1票。

属とか科とか似たのもあるけど気にしない。
50デフォルトの名無しさん:2006/11/13(月) 00:13:44
訳を当てずにkindって言うようにしてる
51デフォルトの名無しさん:2006/11/16(木) 20:28:17

Haskellでオセロゲーム講座まだー?
52デフォルトの名無しさん:2006/11/16(木) 21:02:53
>>48
ふだんごついのに
数学者のかわいい一面ですね。
厳密さが快感だから悩むのでしょうか?
でも、悩むの楽しいのでしょうね^^
53デフォルトの名無しさん:2006/11/16(木) 21:08:18
頭わるすぎてワラタ
54デフォルトの名無しさん:2006/11/18(土) 23:17:47
haskell全然わかんねー

i = 1
main = print $ myPlus i
myPlus :: a -> a
myplus j = j + j

これが動かないのはなんで?
55デフォルトの名無しさん:2006/11/18(土) 23:34:02
エラーメッセージは?
56デフォルトの名無しさん:2006/11/18(土) 23:37:19
- myplus
+ myPlus
57デフォルトの名無しさん:2006/11/18(土) 23:38:49
- myPlus :: a -> a
+ myPlus :: Num a => a -> a
5854:2006/11/19(日) 00:24:59
>>55-57

レスサンクス。コンパイル通ったよ。
でもなにこの「Num a => 」って奴は。haskellは簡単なことが難しいって本当だな。
とりあえず調べてみる。ありがと。
59デフォルトの名無しさん:2006/11/19(日) 03:00:01
エラーメッセージを書こうね
60デフォルトの名無しさん:2006/11/20(月) 07:04:54
諸君、議論したまえ
61デフォルトの名無しさん:2006/11/20(月) 20:44:20
型システムについての解説ありますか?
モナドはたくさんあるけど
62デフォルトの名無しさん:2006/11/20(月) 21:03:22
諸君、議論したまえ
63デフォルトの名無しさん:2006/11/20(月) 21:08:38
>>62
ネタを出してくれ
64デフォルトの名無しさん:2006/11/20(月) 21:12:44
お題: 巨大になりすぎたghcのスリム化について
65デフォルトの名無しさん:2006/11/20(月) 21:25:36
66デフォルトの名無しさん:2006/11/20(月) 21:55:44

GHCいれることにしたからWinHugsをアンインスコしようとした
そしたらダイアログでて以下のようなメッセージ
 ↓↓↓
=============================================================================================
C:\PROGRA~1\WinHugs\UNINST~1.EXE
C:\PROGRA~1\Symantec\S32EVNT1.DLL インストール可能なデバイスドライバはDLL初期化に失敗しました。
アプリケーションを終了するには[閉じる]を選んでください。
=============================================================================================

アンインスコ不可能になた
この前NIS2006を根こそぎ削除したのが原因のようなんだけど
こういう場合どうやったら引き続きアンインスコできんの?
67デフォルトの名無しさん:2006/11/21(火) 00:20:35
ところで文字列"-123.456"を数値-123.456に変換する関数ってあったっけ?
68デフォルトの名無しさん:2006/11/21(火) 00:25:44
これ?
read "-123.456" :: Double
6966:2006/11/21(火) 01:19:16
ヘルプ!
70デフォルトの名無しさん:2006/11/21(火) 05:43:13
>>606
Symantecとか関係なくWinHugsはなぜかアンインストールできない。
なのでさくっとスクリプトを書いてみようと思ったらひどい目にあった。
なんでマルチバイト文字とCharの相互変換もできないんだよ…

ttp://up.uppple.com/src/up0496.txt
FFIを使う羽目になったので、GHCでコンパイルする必要がある。
あと無保証。BIOSが消し飛んでも関知しないから念のため。
71デフォルトの名無しさん:2006/11/21(火) 07:09:34
>>66
それを すてるなんて とんでもない!
7266:2006/11/21(火) 21:39:06
>>77
うそーん
そんな不具合あんのかよw
公式ではまだその対策でてないの?
73デフォルトの名無しさん:2006/11/21(火) 23:20:19
>>72
http://hackage.haskell.org/trac/hugs/ticket/42
認識はされてるけど対策はまだみたいだ。
74デフォルトの名無しさん:2006/11/21(火) 23:27:38
□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□□□□■□□■□□
□□■□□□□□■□□□□□□□□□□□□□□■□□□□□□□□□■□□■□□
□□■□□□□□■□□□□□□□□□□□□□□■□□□□□□□□□■□□■□□
□□■□□□□□■□□□□□□□□□■■□□□■□□□□□□□□□■□□■□□
□□■□□□□□■□□□□□□□□■□□■□□■□□■□□■■□□■□□■□□
□□■■■■■■■□□■■■■□□■□□□□□■□■□□■□□■□■□□■□□
□□■□□□□□■□■□□□■□□□■■□□□■■□□□■■■■□■□□■□□
□□■□□□□□■□■□□□■□□□□□■□□■□■□□■□□□□■□□■□□
□□■□□□□□■□■□□□■■□■□□■□□■□□■□■□□■□■□□■□□
□□■□□□□□■□□■■■□■□□■■□□□■□□■□□■■□□■□□■□□
75デフォルトの名無しさん:2006/11/23(木) 00:35:20

ふつうのHaskellプログラミング買って勉強しはじめた
もう一冊のほうは知らんけど、これわかりやすくていいね
7675:2006/11/23(木) 00:35:50
77デフォルトの名無しさん:2006/11/23(木) 01:28:03
何がしたいねん
78デフォルトの名無しさん:2006/11/23(木) 01:41:12
ひまやねん
スレがのびへんねん
79デフォルトの名無しさん:2006/11/23(木) 10:51:46
諸君、議論したまえ
80デフォルトの名無しさん:2006/11/25(土) 02:20:39
質問です。
HaskellにDoxygenのようなドキュメント生成のためのツールなどはありますか?
81しょしんしゃ:2006/11/25(土) 02:26:37

質問です
GHCとHugsという存在がよくわかりません

Haskellが仕様で、GHCとかHugsが実装環境ってこと?
もしそうなら、仕様ってなに?
どっかにそれをタンマリ書いたPDFとか置いてるの?

『Haskell』ってのはただの説明書?


それともLinuxに例えるならHaskellがカーネルで
GHCやHugsがディストリビューション?

やべぇ、余計わかんなくなってきた
82デフォルトの名無しさん:2006/11/25(土) 03:05:44
>>80
Haddock

>>81
>Haskellが仕様で、GHCとかHugsが実装環境ってこと?
そんな感じ。

>どっかにそれをタンマリ書いたPDFとか置いてるの?
http://haskell.org/onlinereport/
http://www.sampou.org/haskell/report-revised-j/ (日本語訳)
83デフォルトの名無しさん:2006/11/25(土) 03:09:04
>>82
覗いてみたけど眩暈した

>>81のLinuxの例えはあってるかな?
あってるなら納得する
84デフォルトの名無しさん:2006/11/25(土) 03:29:49
Haskellは言語で、Haskell Reportはその定義。
GHCのような各処理系は、この定義に沿ってプログラムを解釈するように作られる。
言い替えると、Haskell ReportはHaskell処理系が満たすべき要件を定めている。

Linuxカーネルはディストリビューションが満たすべき要件を定めたりしないし、
カーネル自身がディストリビューションの一部なので、構造がだいぶ違う。
むしろ、POSIXとLinuxシステムの関係に近い。
85デフォルトの名無しさん:2006/11/25(土) 22:50:34
いみわかんねーーー
86デフォルトの名無しさん:2006/11/25(土) 23:04:56
どうも>>83自身Linuxカーネルとディストロの区別がしっかりついてないんでは
つーかC++言語だってgccだのMS VC++だのBCCだのいっぱいあって,それで普通じゃん...
HaskellもHugsだのGHCだのいっぱいあるのですぉ
87デフォルトの名無しさん:2006/11/25(土) 23:31:43
>>86
一般的なプログラマーならそれで理解できるだろうけど
Javaしか知らんのだよJavaしか!!1
88デフォルトの名無しさん:2006/11/25(土) 23:36:49
Javaだってgcjだのjavacだのいっぱいあって…と言いたい所だが、gcjの知名度は低そう…
89デフォルトの名無しさん:2006/11/25(土) 23:38:20
うん知らない
90デフォルトの名無しさん:2006/11/25(土) 23:48:33
HTMLと各種ブラウザの関係と言った方がわかりやすいんじゃね?
HTML <-> Haskell98
IE,FF,Opera,etc... <-> GHC, Hugs, etc...
91デフォルトの名無しさん:2006/11/25(土) 23:55:59
FFッテナニカトオモタ
え、そんな単純なことなのか
92デフォルトの名無しさん:2006/11/25(土) 23:57:29
ibmのjavaがあるじゃない
93デフォルトの名無しさん:2006/11/26(日) 01:21:32
コマンドライン引数を扱うプログラムってどう書くのでしょうか?
たとえば ghc でコンパイルして
C:\> .\fibonacci.exe 10
55
C:\> .\fibonacci.exe 20
6765
と動作するようなものを書く場合です。
またそれはどのあたりのマニュアルを参照すれば良いでしょうか。
94デフォルトの名無しさん:2006/11/26(日) 01:25:00
>>93
hoogleでarg辺りで検索すればgetArgsが出てくる。
95デフォルトの名無しさん:2006/11/26(日) 01:28:37
>>93
Haskell98なら
System.getArgs :: IO [String]
階層ライブラリなら
System.Environment.getArgs :: IO [String]

GHCに付属しているライブラリの大部分は
http://www.haskell.org/ghc/docs/latest/html/libraries/
にリファレンスがある。
96デフォルトの名無しさん:2006/11/26(日) 01:37:36
Stringってchar型の配列って書いてたけど、これってJavaでもいっしょ?
Javaの本ではそんなの読んだことない
97デフォルトの名無しさん:2006/11/26(日) 01:54:37
>>96
そんな大嘘が書いているのはどこですか?
Haskellではcharの配列とStringはまったく違います。

また、Javaではchar[] != Stringです。
98デフォルトの名無しさん:2006/11/26(日) 02:12:41
>>97
配列ではなくリスト、と言いたいんだよね?
99デフォルトの名無しさん:2006/11/26(日) 02:21:04
Haskell の Array i Char と [Char] はぜんぜん違うデータだし。
100デフォルトの名無しさん:2006/11/26(日) 02:24:30

実は、Haskellでは文字列もリストなのです。文字列は文字のリストとして
表現されていて、特別な「文字列」は存在しません。
ですから、リストの処理を覚えれば文字列処理も身につけたことになります。
                           -----ふつうのHaskellプログラミング
101デフォルトの名無しさん:2006/11/26(日) 02:24:56
JavaのStringクラスはchar配列をラップしたものだね(ライブラリのソースを見れば分かる)
Haskellの文字列はCharのリスト(これを [Char] と書き表す)
Haskellでは配列とリストは別のデータ型.
関数型言語では大抵は配列よりリストのほうが頻繁に使われる.
102デフォルトの名無しさん:2006/11/26(日) 02:28:12
>>97
>>98がアホってこと?
103デフォルトの名無しさん:2006/11/26(日) 03:57:26
>>102
何故?
104デフォルトの名無しさん:2006/11/26(日) 04:46:57
うお、何かデジャブった
105デフォルトの名無しさん:2006/11/26(日) 07:10:26
haskell初心者です。
次のコードは間違っていますか?それとも別の問題でしょうか?

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]
...
106デフォルトの名無しさん:2006/11/26(日) 07:10:40
2chでは、知名度が低い分野のスレほどレベルが高い、という傾向がある。
つまりHaskellはもはやマイナーな分野ではない。
107105:2006/11/26(日) 07:11:44
続き
ghcでコンパイルしようとすると、次のエラーが出ます。
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
です。
108105: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"

但し、半角スペースを記号"*"で置き換えています。
109デフォルトの名無しさん:2006/11/26(日) 09:32:45
>>108
仕様上正しいかどうかは知らんけど、もう一個スペース入れればghcで受け付けるようになる。
もしくは、この例ではdoは必要ないから外してしまうとghcでもOK。

ghcではdo構文の中ではthenとかelseはifの開始位置よりも右から始めないとダメって事になってるのかも。
110デフォルトの名無しさん:2006/11/26(日) 09:43:25
>>107
必要なライブラリをリンクさせてないってことでしょ。
単に ghc hoge.hs としたらhoge.hsだけをコンパイルして標準のライブラリとリンクさせて実行ファイル作るけど、
import System.Posix.Filesをしてるから標準のライブラリには含まれてないものを必要としてて、
それが足りないというエラーが起きてる。

-packge 〜 というオプションをつけて手動で必要なものを指示する方法もあるけど、
--makeオプションを使った方が必要なものを全部自動的に処理してくれるから楽。
ghc --make hoge.hs
111105:2006/11/26(日) 11:37:13
>>109
書き換えれば動くのは確かめたのですが、
処理系によって挙動が異なるので、仕様ではどうなっているのか気になっています。

>>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アボートしました
となり、異常終了してしまいます。
112デフォルトの名無しさん:2006/11/26(日) 12:55:55
if は else を省略してはいけない。仕様上、そう定義される。

特定のときにだけ実行するような場合は Monad (または Control.Monad) を
インポートして when か unless を使え。


あと和訳されてるんだし疑問を持ったら自分で仕様を読めば。
http://www.sampou.org/haskell/report-revised-j/exps.html
113デフォルトの名無しさん:2006/11/26(日) 13:15:46
>>111
仕様が気になるなら仕様書を読むしかない。

do構文が絡んだ場合のインデントについてまとめてあるのを見つけた。
http://en.wikibooks.org/wiki/Haskell/Indentation
114デフォルトの名無しさん:2006/11/26(日) 13:16:47
>>108
if..then..elseは単なる式であって、doの文にするなら一文に収めないといけない。
そのコードだとif...then...とelse...で二文に分かれているので、エラーになるのが正しいはず。
手元のHugs May 2006では
ERROR "test.hs":2 - Syntax error in expression (unexpected `;', possibly due to bad layout)
というエラーになった。
115114:2006/11/26(日) 13:30:35
なぜかWindows版だと通るな。
Hugsのバグかも。
116デフォルトの名無しさん:2006/11/26(日) 13:34:21
>>105
明らかにライブラリまたはHugsの問題。コードは悪くない。
11793:2006/11/26(日) 17:50:31
>>94-95
ありがとうございました。
118デフォルトの名無しさん:2006/11/26(日) 17:56:23
ttp://oss.timedia.co.jp/show/Haskell/Emacs
に書かれている設定で 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 つを全角空白文字に変換しています。)
何か設定がおかしいんでしょうか? それともこういうもの?
119デフォルトの名無しさん:2006/11/26(日) 19:05:30
tabを何回か叩くとインデント位置の候補をローテートしない?
120105:2006/11/26(日) 19:14:27
>>112-116
ありがとうございます。
121デフォルトの名無しさん:2006/11/26(日) 23:15:09
圏論やりながらHaskellやっているのって主にどこの大学でやっているんですか?
それともみんな個人レベルで圏論とHaskellをやっているんですかね・・・
122118:2006/11/26(日) 23:59:42
>>119
おおー、なるほど。ありがとうございました。
123デフォルトの名無しさん:2006/11/27(月) 00:24:10
>>121
いろんなところでやってるでしょ。代表的なのはオックスフォードだけど。
124デフォルトの名無しさん:2006/11/27(月) 00:44:00
125デフォルトの名無しさん:2006/11/27(月) 01:04:05
うぉ。
ていうかこれ去年か。
126デフォルトの名無しさん:2006/11/27(月) 01:07:32
京都産業大学か
127デフォルトの名無しさん:2006/11/28(火) 17:33:23
本物のプログラマをHaskellを使う
128デフォルトの名無しさん:2006/11/28(火) 18:48:09
本物のプログラマでHaskellを扱き使う。
129デフォルトの名無しさん:2006/11/28(火) 20:13:56
あなたをHaskellです
130デフォルトの名無しさん:2006/11/28(火) 20:20:06
目的語指向言語のスレはここですか?
131デフォルトの名無しさん:2006/11/28(火) 23:56:32
Haskellがすでに失敗している10の理由
ttp://d.hatena.ne.jp/m-a-o/20061123#p2
132デフォルトの名無しさん:2006/11/29(水) 00:01:57
>>131
HelloWorldしか書けない初心者の俺がみても
10個中10個が失敗した理由になってねーよw

人気でない10の理由ってんなら少しはわかるが

133デフォルトの名無しさん:2006/11/29(水) 00:07:45
134デフォルトの名無しさん:2006/11/29(水) 00:58:53
ttp://www014.upp.so-net.ne.jp/tetryl/llw2004/ll-samurai.txt

> 残念!
> 「Hello worldさえブラックボックス」
> 斬り

古いネタだけど吹いたw
135デフォルトの名無しさん:2006/11/29(水) 02:08:20
>>134
ごめん全部読んだけど、面白くなかった。
何かお笑い芸人のネタみたい。
136デフォルトの名無しさん:2006/11/29(水) 05:31:54
ギター侍を知っていることが前提のネタだから仕方がない
137デフォルトの名無しさん:2006/11/29(水) 23:10:29
>3. 型推論も遅延評価も飛躍的な進歩というわけじゃない。

遅延評価はパラダイム的にはものすごい進歩だとおもうけど。プログラム言語内に無限概念を取り込むことに成功している。

数学チックにいうと
遅延評価のない言語=代数的
遅延評価のある言語=超越的
とでもいうか・・・。
遅延評価は何気にHaskellの一番の利点だと思う。(パラダイム的に)
型推論なんて比べ物にならね。(比べるものではないが、ていうか比べられないけど)
138デフォルトの名無しさん:2006/11/29(水) 23:16:31
あんまりよく読んでなかったorz
139デフォルトの名無しさん:2006/11/29(水) 23:25:33
遅延評価はHaskellの一番の欠点だと思う。
言語に組込みで持つには(計算機アーキテクチャから見て)複雑過ぎるし、
オーバーヘッドが大きすぎるし、空間効率の予測が難しすぎる。

たしかに遅延リストや遅延木は便利だけど、
それは言語に遅延評価を組み込む理由にはならない。
例えば遅延リストはOCamlやSchemeでも扱えるはず(違ってたらごめん)。

型推論とどっちを取るかといわれたら、俺なら間違いなく型推論をとる。
140デフォルトの名無しさん:2006/11/29(水) 23:29:05
おめーら
専門用語きんし

↓以後ひらがな+説明文添付必須
141デフォルトの名無しさん:2006/11/29(水) 23:29:54
結局は好みだよな。
だけど、言語機能として一貫して遅延させるのと単に遅延評価を扱えるってのとでは話が違ってくる事柄なので、
そういった形での比較はナンセンスだと思う。
遅延評価は遅延評価なりのメリットがあるので別に要らない場面ではOCamlでもSchemeでも使ってりゃいいんでね?
142デフォルトの名無しさん:2006/11/29(水) 23:31:39
常に!つかえば
143デフォルトの名無しさん:2006/11/29(水) 23:37:50
>そういった形での比較はナンセンスだと思う。
あー確かに議論が混乱してたかも。すまん。

>別に要らない場面ではOCamlでもSchemeでも使ってりゃいいんでね?
**が欲しいなら**言語を使え、というのは余計なお世話だ。
Haskellにあってその二言語にない特徴なんて遅延評価以外にもいくらでもあるわけで。
144デフォルトの名無しさん:2006/11/29(水) 23:46:41
遅延評価=>ε-δ論法
すなわちHaskellは無限概念を内包しているのだ!


といってみる。
145デフォルトの名無しさん:2006/11/29(水) 23:48:43
てめー記号まで使うな
よめないぞ
146デフォルトの名無しさん:2006/11/29(水) 23:50:16
つーかIOモナドも遅延評価なかったら使えないだろ。
147デフォルトの名無しさん:2006/11/29(水) 23:53:40
>>146
なんで?

確かに
main = putStrLn "foo" >> main
みたいなのは書けなくなるけど、
main = putStrLn "foo" >>= (\_ -> main)
と書けばいいので問題ないと思うんだが。
148デフォルトの名無しさん:2006/11/29(水) 23:54:42
C++で書いてると、たまにHaskellが恋しくなります。
Haskellで書いてると、たまにC++を頼もしく感じます。
修行が足りない?
149デフォルトの名無しさん:2006/11/29(水) 23:55:24
遅延評価無いとモナド使うのマンドクサ。

例外モナドがMaybe aではなく() -> Maybe aだったとすると

do
foo
bar



do
(\_ -> foo)
(\_ -> bar)

って書かないといけなくなる。
150デフォルトの名無しさん:2006/11/29(水) 23:56:06
>>147
実装上の問題。正格では実装できない。おそらくね。
全然違うかもしれんが。
151デフォルトの名無しさん:2006/11/30(木) 00:02:22
>>149
それは気づかなかった。
その例だとdoを展開するときに>>でなく>>=を使うようにするだけで十分だけど、
類似の例がもっとあるといやだな。

>>150
newtype IO a = IO (() -> a)
で十分なはず。
C++でIOモナドを書いてみたら一応動いたのでたぶん問題ない。
152デフォルトの名無しさん:2006/11/30(木) 00:03:44
>>151
なぬ。馬鹿な。
153デフォルトの名無しさん:2006/11/30(木) 00:04:05
>>143
Haskellにとって遅延評価は基盤であり、その他の便利な特徴もそれを前提としているものが少なくない。

>>139の「それは言語に遅延評価を組み込む理由にはならない。」
というのがあるから嫌なら特に必要ない限り他の選択肢を選べばいいんでね?
という程度の考えだった。

逆に言えばHaskellの特徴の便利な部分をOCamlやSchemeでは実現しえないものか?
できないならやっぱHaskellの遅延評価とそのほかの特徴は切り離せないものと割り切るしかなかろう。
154デフォルトの名無しさん:2006/11/30(木) 00:13:39
>>153
遅延評価がないと難しそうなもの(where節とか)もあるけど
そうでもなさそうなもの(型クラスとか純粋さとかインデントによる構文とか)も結構あると思う。
155デフォルトの名無しさん:2006/11/30(木) 00:33:51

    スーパーモ゛ナ゛ードッ!!

      ヽ/\ , ,
    | \ヾ   // |, ,
   ヾ         //,,
  \    ∧/|,//_  /"
  ヾ   ヾ,ヘヘ / ,/ /,
 \   ヾ|/|/ヽノ/,/  /"
  丶   (`∀´ ∨   /,
  \  d    つ   /"
  ヽ   |  |  |   /,,
  \__,,,(_(__),,,_/"
156デフォルトの名無しさん:2006/11/30(木) 00:53:46
遅延リストってジェネレータで代替えできるしなぁ
157デフォルトの名無しさん:2006/11/30(木) 01:17:54
haskellのソースって結局Monad使って手続き的に書いている場合が多い希ガス

ttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3aLazyEvaluation
ここでnobson氏とShiro氏がSchemeで遅延評価にいろいろ挑戦しているみたいだけど
やっぱり完ぺきに実現するのは無理っぽいね
158デフォルトの名無しさん:2006/11/30(木) 12:17:46
無限概念の話、無視しないで・・・。
159デフォルトの名無しさん:2006/11/30(木) 12:44:01
>>158
BASIC でも無限ループが書ける。
160デフォルトの名無しさん:2006/11/30(木) 16:54:46
>>156
遅延リスト(無限リスト)とジェネレータ(ストリーム)は
本質的に異なる構造を持っているので、理論上代替は不可能。

実用上はだいたい代替できるんだけどね。
理論屋としては別物として考えておきたい。
161デフォルトの名無しさん:2006/11/30(木) 19:02:29
同じ終代数を持ちそうだがな
162デフォルトの名無しさん:2006/11/30(木) 21:41:56
>>148
俺もだ。
だれかHaskellとC++とDとMerdとRubyとNemerleの良いとこ取りした言語
作ってくれないかな。
163デフォルトの名無しさん:2006/11/30(木) 21:49:01
アセンブリを関数型で書いたりできないの?
164デフォルトの名無しさん:2006/11/30(木) 21:56:20
Lambda, the Ultimate Label?
165デフォルトの名無しさん:2006/11/30(木) 21:58:39
>>162
C++3xはそれらを全て取り込んだ究極言語になるらしいよ。
166デフォルトの名無しさん:2006/11/30(木) 22:08:55
3xワラタ
言語仕様が10巻本で出そうだな。
167デフォルトの名無しさん:2006/12/01(金) 00:31:39
>>139
>遅延評価はHaskellの一番の欠点だと思う。

遅延評価を実装することが、Haskellおよびその祖先のそもそもの目的だったのよ
遅延評価がHaskellの存在意義なの
168デフォルトの名無しさん:2006/12/01(金) 01:31:50
最近Haskellの勉強始めたんだけど全然わかんね。
ラムダ計算や圏論とかモナドって考え方がさっぱりだ。
これって計算機科学や数学を勉強しなきゃならんね。
情報系の学部ってこんなんやってんの?
169デフォルトの名無しさん:2006/12/01(金) 01:39:42
>>168
プログラミングは計算機科学じゃないから。
170デフォルトの名無しさん:2006/12/01(金) 01:40:53
「情報工学」とかになるとプログラミングに関する事もやってたりするけど。
171デフォルトの名無しさん:2006/12/01(金) 11:05:07
>>168
>ラムダ計算や圏論とか

haskell使うだけなら必要ない。
もしhaskellの入門本にラムダ計算や圏論が説明されていてもそこはすっとばしていい。
172デフォルトの名無しさん:2006/12/01(金) 14:37:21
現時点で最強の関数型言語はエクセルです。
すべてにおいて
エクセル>>>>>ハスケル

ハスケル厨は勘違いしないように。

名前自体パクりっぽいよな。
173デフォルトの名無しさん:2006/12/01(金) 14:38:09
だれか.NETに乗っけてくれ。
そうすれば必要なところではHaskell、あとはC#ですむ。
174デフォルトの名無しさん:2006/12/01(金) 19:38:41
Haskell.netはあったはずだが…
175デフォルトの名無しさん:2006/12/01(金) 22:55:47
>>171
そうなのか?俺も初心者だけど
そこを理解してこそ、Haskellを勉強する価値があるんじゃないのか?
176デフォルトの名無しさん:2006/12/01(金) 22:59:42
177デフォルトの名無しさん:2006/12/01(金) 23:20:53
>>175
それは何のためにHaskellを勉強しているかに依るだろ。
俺は数学的背景をほとんど知らないけど、Haskellで
快適にコーディングができる程度には「使え」るし、
Haskellを勉強して得たものは非常に大きいと思う。

もちろん、背景を理解すると見えるものが一変する、という可能性は
否定できないけど。
178デフォルトの名無しさん:2006/12/01(金) 23:23:52
>>176
そのコードを自動でメモ化する処理系なんてあるのか?
さすがにそれを効率的だと言うのは誇張かと。
179デフォルトの名無しさん:2006/12/02(土) 00:44:09
>>173

なぜか3つもあるHaskell.NET
http://www.dotnetpowered.com/languages.aspx
180デフォルトの名無しさん:2006/12/02(土) 13:56:21
WinHugsどうやって削除すればいいですか?
直接レジストリ消そうと思うんだけど、どれ消せばいいのかわからない
Software以外に関係してるとこあるのかな
181デフォルトの名無しさん:2006/12/02(土) 14:32:53
>>180
インストール時の選択によって違う。
詳しくは>>70のgetRegsを読んでくれ。
182デフォルトの名無しさん:2006/12/02(土) 16:46:14
HKEY_LOCAL_MACHINE hKEY_LOCAL_MACHINE SOFTWARE\\Haskell
HKEY_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かな?
183デフォルトの名無しさん:2006/12/02(土) 18:18:11
>>182
>HKEY_LOCAL_MACHINE hKEY_LOCAL_MACHINE SOFTWARE\\Haskell
>HKEY_CURRENT_USER  hKEY_CURRENT_USER  Software\\Haskell
中身がhugsだけでないなら消すとまずい。
184デフォルトの名無しさん:2006/12/02(土) 18:28:39
あ、そっか
GHCとかもその下に含まれてるね

その下のHugsってのだけ削除すればいいか
185デフォルトの名無しさん:2006/12/02(土) 22:13:19
>>171
逆にその辺の知識を勉強したいと思った場合どこから手を付ければいいんだろう?
高校レベルまでしか数学知識ない状態で。
186デフォルトの名無しさん:2006/12/03(日) 08:22:32
Jacobの黄色い本なんかがいいんじゃないか
187デフォルトの名無しさん:2006/12/03(日) 21:24:57
>>185
現実的に言って働いている社会人だとほとんど不可能だと思う。
理由としては。
1.時間が馬鹿みたいに必要。(日常生活に確実に侵食してくる)
2.難しいのでモチベーションが続かない。(理系は視野が狭いというが狭い視野じゃなきゃやってられねぇ。)
3.自己流だと確実に変な方向に行ってしまう(数学基礎論にはまってしまってその考えから抜け出せなくなってしまうのがよくあるオチ。数学は記号論理学じゃない。)
188デフォルトの名無しさん:2006/12/03(日) 21:26:04
まともにやろうと思えばだけれど。
189デフォルトの名無しさん:2006/12/03(日) 21:32:09
>1.時間が馬鹿みたいに必要。(日常生活に確実に侵食してくる)
貯金が溜まりますねー
190171:2006/12/03(日) 23:13:30
>>175

>>171

>haskell使うだけなら

という限定つき。
たとえば、チューリングマシン知らなくてもC言語は使えるようになるし。
むしろ、基礎理論をうまく隠蔽できないなら、プログラミング言語の設計としては失敗といえるかも。
191デフォルトの名無しさん:2006/12/03(日) 23:32:41
>>187
> 3.自己流だと確実に変な方向に行ってしまう(数学基礎論にはまってしまってその考えから抜け出せなくなってしまうのがよくあるオチ。数学は記号論理学じゃない。)

そんな奴みたことない。
それに、この分野、まだまだみんな自己流じゃないの。
数学や物理のように確立されたカリキュラムもないし。
192デフォルトの名無しさん:2006/12/04(月) 09:53:06
>>191
そこからは自己流だがそこまで行くための基礎的な部分までの話。
基礎ができないと応用はできない。
193デフォルトの名無しさん:2006/12/04(月) 15:20:35
GHCってhaskellで書いたソースをCに変換させてコンパイルさせているのでしょうか?
haskellソース→Cソース→アセンブラソース・・・
それとも直接アセンブラのソースに行くのでしょうか?
haskellソース→アセンブラソース・・・
194デフォルトの名無しさん:2006/12/04(月) 16:12:18
上のほう
でも当然読めるようなCじゃない
195デフォルトの名無しさん:2006/12/04(月) 16:15:20
場合によっては直接アセンブリを生成する。これは-fvia-Cと-fasmで制御できる。
196デフォルトの名無しさん:2006/12/04(月) 16:32:04
>>191
1ヶ月でできるお勧めカリキュラム

1週目 λ計算。とりあえずD∞ modelあたりまでやる
2週目 型理論。ざざっとSystem Fまでやる
3週目 圏論。1,2週目の理解をもとにCCC modelまで。
4週目 記号論理学。LKLJNKNJの規則をながめる。

この後は興味に応じて論文を読み漁ればok
197デフォルトの名無しさん:2006/12/04(月) 17:42:23
そのカリキュラム、相当ヒマで相当モチベーションの高い人間でも
こなすのが辛いような気がするんだが。
198デフォルトの名無しさん:2006/12/04(月) 18:10:44
まあ進度は時間と能力に応じて変わるかも。
でも、この辺の分野は親切な入門書もたくさんあるし、自己流の罠? にはまることもないと思う。
199デフォルトの名無しさん:2006/12/04(月) 20:24:18
社会人で独学で勉強していておかしな方向に行っている俺様が来ましたよ。

つーか。196は社会人なめとんのかい。
社会人の場合、一日にかけられる勉強時間でせいぜい30分とか
1時間だぞ。その時間をとれないことも多い。

しかも環境も劣悪で電車の中とか、仕事で疲れた状態だとか、あんまり
頭に入るような状況ではない。

こういう話を聞くとまた、過酷な勤務の底辺DQNプログラマか、と思う奴も
いるだろうけど(DQNなのはあっているが)、社会人で9時6時で帰れるような
職場はありません。9時ぐらいまでで帰れる職場でも同じで、それは一般的
には楽な職場と言われている。

しかもカリキュラムがいきなりλ計算。
高校卒業程度の数学力と言っているのにλ計算以前に勉強することが
あるだろうと小一時間...。つーか、記号論理学とかはλ計算以前に
やるべきだと思うがどうか。

むしろ独習の場合、自分のペースで学習が進んでかつ理解度を試される
ことがないので、解った気になって先に行ってしまうのがあらぬ
方向に進んでしまう気がするがどうか。早くカリキュラムを進める
理解力より、ゆっくり物になるまで粘る忍耐力の方が重要な気がするけど、どう。


200デフォルトの名無しさん:2006/12/04(月) 20:47:03
>>196
やってみます。お薦めの本を教えてください。洋書でもいいです。
201デフォルトの名無しさん:2006/12/04(月) 21:14:18
来週からλ計算開講だお
202デフォルトの名無しさん:2006/12/05(火) 01:18:01
>>201
頼むぞホント
高卒でもわかるように説明できないようじゃ価値ねーからな
203デフォルトの名無しさん:2006/12/05(火) 01:31:58
>>201
おい、何レス使うつもりだ
204デフォルトの名無しさん:2006/12/05(火) 02:50:07
>>194,195
有り難う。
んじゃ、Cで関数書いて呼び出したり
アセンブラで書いた関数をCで呼び出して
その関数をさらにhaskellで呼び出すことも可能なのでしょうか?
205デフォルトの名無しさん:2006/12/05(火) 04:12:04
>>204
もちろんできる。
そもそもForeign Function InterfaceというのがHaskell98の追補にあって、
たぶん全ての実装で利用できる。
http://www.cse.unsw.edu.au/~chak/haskell/ffi/
206デフォルトの名無しさん:2006/12/05(火) 04:35:51
ふーん、そこまで機能がそろっているのに
なぜ誰もOSを書こうとしないの?
アセンブラとCが使えるならOS作れそうな気が
するのだけれど。
207デフォルトの名無しさん:2006/12/05(火) 04:52:36
検索したら見付かったが。

http://programatica.cs.pdx.edu/House/
>House is a demo of software written in Haskell, running in a standalone environment.
208デフォルトの名無しさん:2006/12/05(火) 14:54:22
そういう車輪の再発明っていうか、単に言語間の移植は、作ってるうちに空しくなるんだよ
209デフォルトの名無しさん:2006/12/05(火) 21:13:27
ghcでアセンブラの勉強できないの?
210187:2006/12/06(水) 11:24:57
>>199
>つーか、記号論理学とかはλ計算以前に
>やるべきだと思うがどうか。
やるとしてもかなり初歩の部分だけでいいと思う∀、∃、とかの意味をちゃんと「理解して使える」ようになればいいと思う。
あんまり込み入ったところは使わないしおそらく必要性もないと思う。
というかかなりごちゃごちゃしていてやる気がしないはず。(俺はしなかった)

>むしろ独習の場合、自分のペースで学習が進んでかつ理解度を試される
>ことがないので、解った気になって先に行ってしまうのがあらぬ
>方向に進んでしまう気がするがどうか。早くカリキュラムを進める
>理解力より、ゆっくり物になるまで粘る忍耐力の方が重要な気がするけど、どう。
理解度を試されるというところもそうなのだけれど、根本的に数学を理解するということを勘違いしていることが多い(勘違いしていました。)
数学は語学です。

おそらくもっともいい方法は圏論勉強会に一回だけでも出てしまうのがいいと思う。(ちなみに俺は行った事ない)
なんとなく方向性はつかめるんじゃないかと勝手に思う。
211デフォルトの名無しさん:2006/12/06(水) 18:31:09
>>210
察するに、あなたは「自己流」でなんとかなったんじゃないの?
212199:2006/12/06(水) 20:00:59
> あんまり込み入ったところは使わないしおそらく必要性もないと思う。
> というかかなりごちゃごちゃしていてやる気がしないはず。(俺はしなかった)
こういうところで手を抜くと、後々しょうもないところで限界がくる
というか、学習に広がりがなくなると思うのでやった方がいいと思うけど
どうなんでしょう。それこそ独学の罠なんじゃないんでしょうか。

計算機科学の勉強は何も関数型言語だけじゃなく、論理学がつかわれている
データベース、公理的意味論、モデル検査などなど色々面白そうな
トピックスがあるのでこれらを楽しめないのは損...だと思うんだけど。
当然、関数型言語の勉強をするにも論理学はあった方がいいと思うんだけど。
213デフォルトの名無しさん:2006/12/06(水) 20:07:34
そういう意味では、記号論理学は語学、だな
214デフォルトの名無しさん:2006/12/06(水) 20:27:50
もうちょっとわかりやすくて楽しそうなスレになりませんか?
215デフォルトの名無しさん:2006/12/06(水) 20:33:56
論理学だの計算機科学だのそんなことはどうでもいい
ここはム板で、Haskellでプログラミングすることに関するスレだ。
関係ない話は情報学板・数学板でやれ
216デフォルトの名無しさん:2006/12/06(水) 20:46:31
以後、ラムダ計算とか圏論とかの話題は禁止な
217デフォルトの名無しさん:2006/12/06(水) 21:41:41
そんなことよりラムダ計算とか圏論とかの話しようぜ
218デフォルトの名無しさん:2006/12/06(水) 21:45:30
そんなことより鮫の話しよーぜ
219デフォルトの名無しさん:2006/12/06(水) 21:46:14
そんなことよりオセロやろーぜ
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │○│●│  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │●│○│  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
220デフォルトの名無しさん:2006/12/06(水) 22:03:09
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │○│●│  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │●│○│ λ│  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
221デフォルトの名無しさん:2006/12/06(水) 22:04:34
>>215
そんなに固いこといわなくても。
理論よりの話題が多いのは、そっちに興味のある住人が多いからだろう。
そもそも過疎スレで、Haskellでのプログラミングについてだって
盛り上がっているとはいえない(いったいHaskellでコード書いてる奴が
どれくらいいるのか)んだから、無理に話題をしぼってもいいことはないと思う。

もちろん、興味のない議論が長々と続くのは不愉快だと思うが、
その時は自分でネタを出すくらいの勢いで。
222デフォルトの名無しさん:2006/12/06(水) 22:05:34
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │○│●│  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │λ│λ│λ│λ│  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
223デフォルトの名無しさん:2006/12/06(水) 22:06:36
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │ &│  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │○│●│  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │λ│λ│λ│λ│  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
224デフォルトの名無しさん:2006/12/06(水) 22:07:36
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │&│  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │&│●│  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │λ│&│λ│λ│  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │&│  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
225デフォルトの名無しさん:2006/12/06(水) 22:11:40
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │&│  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │&│●│  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │λ│●│λ│λ│  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │●│&│  │  │  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
226デフォルトの名無しさん:2006/12/06(水) 22:14:48
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │&│  │  │  │  │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │&│&│  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │λ│●│λ│&│  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │●│&│  │  │&│  │λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │  │  │  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃
┗━━━━━━━━━━━━━━━━━┛
227デフォルトの名無しさん:2006/12/06(水) 22:19:46
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │  │  │  │  │  │  │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │●│  │  │  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │●│  │  │  │  │λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │●│&│  │  │  │┃  λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃    λ...
┃│  │  │λ│●│λ│&│  │  λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│  │  │●│&│  │  │&│λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃   λ...
┃│  │  │  │  │  │  │  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│  │  │  │  │  │  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃    λ...
┗━━━━━━━━━━━━━━━━━┛
228デフォルトの名無しさん:2006/12/06(水) 22:24:15
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │  │ λ...  λ...         λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  λ...  λ...          λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  λ...  λ...        λ...      λ...  λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │ λ...     λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃  λ...
┃│ λ...    λ  λ   λ...
┃├─┼─┼─┼─┼─┼─┼─┼─λ...
λ...     λ...λ... λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃  λ...
┃│  │  │ λ...    λ...    λ...
┃├─┼─┼─┼─┼─┼─┼─┼λ... λ...
┃│  λ...     λ...    λ...
┃└─┴─┴─┴─┴─┴─┴─λ...   λ...
┗━━━━━━━━━━━━━━━━━┛
229デフォルトの名無しさん:2006/12/06(水) 22:25:07

鮫って魚が交尾するから鮫って書くんだぜ
230デフォルトの名無しさん:2006/12/06(水) 22:25:11
>>222-228
結局はλってこったな
231デフォルトの名無しさん:2006/12/06(水) 22:27:48
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │∃│∃│  │  │  │  │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │●│∃│  │  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│∀│  │  │●│  │∀│  │  │λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │∀│  │●│&│  │  │  │┃  λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃    λ...
┃│  │∀│λ│●│λ│&│  │  λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│  │  │●│&│  │  │&│λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ ∀ λ...
┃│∃│  │  │  │∀│  │  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│  │  │∃│  │∃│  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃    λ...
┗━━━━━━━━━━━━━━━━━┛
232デフォルトの名無しさん:2006/12/06(水) 22:30:32
┏━━━━━━━━━━━━━━━━━┓
┃┌─┬─┬─┬─┬─┬─┬─┬─┐┃
┃│  │  │∃│∃│  │  │  │  │┃ λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │  │  │∨│∃│  │  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│∀│  │  │⇒│  │∀│  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃
┃│  │∀│  │∨│&│  │  │  │┃  λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃    λ...
┃│  │∀│∧│∀│∧│&│  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│  │  │⇒│&│  │  │&│  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃  λ...
┃│∃│  │  │  │∀│  │  │  │┃λ...
┃├─┼─┼─┼─┼─┼─┼─┼─┤┃ λ...
┃│  │  │∃│  │∃│  │  │  │┃
┃└─┴─┴─┴─┴─┴─┴─┴─┘┃    λ...
┗━━━━━━━━━━━━━━━━━┛
233デフォルトの名無しさん:2006/12/06(水) 22:40:21
λがいなくなってすっきりしたな
234デフォルトの名無しさん:2006/12/06(水) 22:56:57
ParserCombinator とかだと簡単過ぎて、
文章書いてる、または、データ入力の仕事している気分で全く面白くない。
235デフォルトの名無しさん:2006/12/06(水) 23:20:40
parsecに浮気したこともあったが、結局左再帰の処理が
鬱陶しくなってhappyに戻った。
236デフォルトの名無しさん:2006/12/08(金) 00:37:39
>>211
ならなかった。それ気づいたときなんか毎日泣いた。
だからなんか粘着気味にレスしてる。

>>212
記号論理学は(偏見かもしれないが)直感が効かない。
数学でも直感てすごく大事。
あれはほぼ超絶テクニックのアルゴリズムの塊だから
やっても面白くないと思う。
最初から直感の聞かない数学の分野やっちゃうと
それが数学だと思っちゃう。まぁそれも確かに数学
なんだがあれは自分の人生をそれにすべて費や
しているような人がやるもんだ。
たとえば、基礎論とかゼータ関連ね。

煽りとかじゃなく>>212はブルバキって知ってるか?
237デフォルトの名無しさん:2006/12/08(金) 00:57:14
ん。なんかよく読むと趣旨がわからなくなっているな。

まぁ要するに>>212が必要としている論理学のレベルは
ほかの分野の数学やっていれば自然に身につく。多分。
だったらほかの直感の効くわかりやすい分野から始めた
方がいいんじゃないかと。
あえて記号論理学みたいな諦める可能性90%なやつから
始める必要なんてなかろう。必要性が出てきたときに勉強
すればいいんじゃないかと。
238デフォルトの名無しさん:2006/12/08(金) 01:11:18
すれ違い
いい加減ウザい
239デフォルトの名無しさん:2006/12/08(金) 01:16:56

圏論理解するのにどんくらいかかる?
高卒で数IIもわからんし、基本情報処理もさっぱり
240デフォルトの名無しさん:2006/12/08(金) 01:22:19
基礎も何も無いのに、かっこよさそうだからと飛びつくような人間は、
どんな分野も一生理解出来るようにはならんよ。
241デフォルトの名無しさん:2006/12/08(金) 01:25:49

くっだらねーレスしてる暇あったら馬鹿にでもわかるような説明考えろよ
242デフォルトの名無しさん:2006/12/08(金) 02:02:34
>>239
日本に圏論を理解してると自覚している人が誰もいないのに?
243デフォルトの名無しさん:2006/12/08(金) 02:03:19
>>239
人に依るとしか言えない。取りあえず入門の第一歩
http://d.hatena.ne.jp/m-hiyama/20060821/1156120185
を読んでどう思ったか教えてくれ。
244199:2006/12/08(金) 04:14:43
ブルバキの名前も知らないと思われているところをみると、
本当に何も知らない人なんじゃないかと思われているような。

たぶん、想像しているレベルの論理学のイメージはそんなに
変わらないはずだよ。

自分もそんなにディープな論理学の知識はいらんと思うが
(それはやぶ蛇)、自然に覚えるのでなく、それ用の入門書
ぐらい嫁というスタンスなんだが。俺もそれ以上はやってない。

> あえて記号論理学みたいな諦める可能性90%なやつから
どこまでやって諦める可能性90%というのか知らないけど。
言われてみればそんなに簡単ではないのは確かにそうだな。
245デフォルトの名無しさん:2006/12/08(金) 04:41:44
まあHaskellスレに来るような人にとってはλ計算の方が
記号論理学より入りやすいんじゃないかな。
プログラム言語だし。

わかってみれば浅い話でも、
いきなりシーケント計算とかみると投げ出すでしょフツー
246デフォルトの名無しさん:2006/12/08(金) 11:29:00
>ブルバキの名前も知らないと思われているところをみると、
>本当に何も知らない人なんじゃないかと思われているような。

名前だけじゃなくてその集団の目指したこととその失敗のことを
言っているんじゃないか。
247デフォルトの名無しさん:2006/12/08(金) 18:32:55
ブルバキについて言及する奴の99%は、その著書を1ページも読んでない。
248デフォルトの名無しさん:2006/12/08(金) 20:30:21
数学原論をまともに読む気するか?
249デフォルトの名無しさん:2006/12/08(金) 21:02:59
>>242
そうなの?
圏論勉強会は?
250デフォルトの名無しさん:2006/12/09(土) 00:12:51
conceptual mathematicsにはファンクタも出てこないじゃないですか。
ってamazon(us)で批評されてたけど、
実際、Haskellプログラミングや関連論文読む力付ける目的に合ってるの?
結構長いし、ちょっと不安す
251デフォルトの名無しさん:2006/12/09(土) 00:52:06
!!ファンクタ出てこないの?
でも、いまつづいてる連載ってfmapを結構頻繁に使ってない?
252デフォルトの名無しさん:2006/12/09(土) 01:30:37
>>250
俺も conceptual mathematics をざっと読んだけど出てくるのは product, sum, exponetial まで。
でも具体例でじっくり書いてあるので足元を固めて自力をつけるのにはよいかもしれない。
理解してたつもりでも実際練習問題解くとむずかしいものも多い。
取りあえず浅く知って(真に理解したという意味ではないよ)早く先に進みたいという人には向かない。
253252:2006/12/09(土) 01:50:51
補足
equalizer も確かでてきてた。
「自力をつける」は「地力をつける」だった。
254デフォルトの名無しさん:2006/12/09(土) 03:02:44
そういえば圏論勉強会の結果みたいなホワイトボードの写真あるけど
ほとんど説明無い。ほとんど有向グラフの図ばっかり。
あの図だけ見て何が何をやっているのか理解している人いるの?
255252:2006/12/09(土) 03:37:30
>>254
同じテキスト読んでればボートの図だけで大筋何を言わんとしているかは想像できる。
256デフォルトの名無しさん:2006/12/09(土) 12:29:51
素直に圏論の基礎読めば良いんじゃね。
なんでわざわざ洋書にこだわるんだ。
257デフォルトの名無しさん:2006/12/09(土) 12:32:39
そんなもんオマエ…マクレーンが読めるようならこんなとこにおらんやろ
258デフォルトの名無しさん:2006/12/09(土) 13:36:44
なんだか不穏な空気が流れてきたな・・・。
もうこの話し止めほうがいい気がしてきた。
259デフォルトの名無しさん:2006/12/09(土) 13:37:35
さすがにもはや Haskell から遠ざかりすぎだしな
260デフォルトの名無しさん:2006/12/09(土) 13:45:07
Haskellプログラミングでは圏論をあまり意識しなくても良くなっている。
これ以降圏論の話は数学板か情報学板でするように。
261デフォルトの名無しさん:2006/12/09(土) 15:00:13
>>258
けんのん?
262デフォルトの名無しさん:2006/12/09(土) 19:57:47
>>260
いや。ファンクタだけは理解しておいたほうが良いんだよ。
fmapがちゃんとつかえるのと使えないのとでは結構違いがある。
liftMも同じく。
263デフォルトの名無しさん:2006/12/09(土) 20:03:31
>>262
圏論を理解していなくても使える。
264デフォルトの名無しさん:2006/12/09(土) 20:12:14
使い方を間違える。
265デフォルトの名無しさん:2006/12/09(土) 20:20:00
圏論を理解していないとfmapがちゃんと使えないって例えばどんな場合?
266デフォルトの名無しさん:2006/12/09(土) 20:41:36
>>261
ふおん
267デフォルトの名無しさん:2006/12/09(土) 20:53:03
なんていうか読みづらくなる。

使い方を間違えるって言うのはおかしかったな、すまん。
268デフォルトの名無しさん:2006/12/09(土) 21:06:54
ふと思ったんだが、fmapとliftMをHaskellで日常的に
使ってますって人ってどれくらいいるもんなんかな?

連載では多用しているけど。
269デフォルトの名無しさん:2006/12/09(土) 21:09:28
つまり、理想的な書き方と比べて意味的には同等だけど
読みづらい書き方になる、ってことか。

どっちにしても例が欲しい。

>>268
fmapは使わないけどliftMは日常的に使う。
270デフォルトの名無しさん:2006/12/09(土) 21:20:16
例・・・。そうだな。極端な例だと
`fmap`,`liftM`みたいに中間演算子的に使われると
どういう意図でそれをつかっているのか意味がとれない。

あとは、できるだけ
たとえば
calc :: a -> a
という関数があったらIOモナド用に
calcIO :: IO a -> IO a
calcIO = fmap calc
みたいに使ってもらったほうが構造だけは同一で元となっている
カテゴリーだけが違うということが明確になっていいんじゃないかと
思っている。

うーん。うまく伝わっただろうか・・・。
というかあまりいい方法じゃないのかなとか思ってきた・・・。
271デフォルトの名無しさん:2006/12/09(土) 21:29:28
なるべく根本的な関数定義はラムダ計算のカテゴリー内で
やってしまって後はカテゴリーごとにfmapするなりliftさせるなり
したほうが再利用できるようになるし。

sample :: a -> IO a
なKleisli射はなるべく作らない方向性でいくべきなんじゃないかって。

モジュール化も損なわれるんじゃないかと。
でもそこまでいってしまうと作れなくなってしまうというジレンマに陥って
しまうから・・・。どうなんだろうねぇ。。
272デフォルトの名無しさん:2006/12/09(土) 21:47:36
>>270
レスありがとう。

>`fmap`,`liftM`みたいに中間演算子的に使われると
>どういう意図でそれをつかっているのか意味がとれない。
これは俺も時々やるんだが、気持ち悪いと感じるのはたぶん分かった。
圏論の観点からはfmapは(射に作用する)単項演算であって
二引数関数のように使うのは不自然だ、ということか。(素人なので間違ってたら教えてくれ)

このスタイルを弁護しておくと、Haskellではあらゆる場合について
(g f) x

f `g` x
が等しいので、後者を見た読者は前者を見たのと同じように理解することが期待されている。
だから、両者を単純に字面上のおさまりに基づいて使い分けることができる、という考え方が
あり得ると思う。例えば f x の代わりに f `id` xと書くのがそんなに変だろうか。
加えて、それを言い出すと(>>=)だって圏論的には一引数の演算なんじゃないか、とか。

calcの例は理解できなかった。せっかく説明してもらったのにすまん。
273デフォルトの名無しさん:2006/12/09(土) 22:01:34
>>271
それは例えば標準入力からCSV形式のデータを読みたいときに、
getCSV :: IO [String]
のようなものをgetChar/getLine/getContentsを使って書くよりも、
parseCSV :: String -> [String]
を用意してユーザ側でfmap parseCSV getContentsとさせた方が良い、
という理解でおk?
それなら多くのHaskellユーザが経験的にやってることだと思うんだが。
274デフォルトの名無しさん:2006/12/09(土) 22:19:06
>272

>圏論の観点からはfmapは(射に作用する)単項演算であって
>二引数関数のように使うのは不自然だ、ということか。(素人なので間違ってたら教えてくれ)

その通り。というかそう自分としては解釈している、というほうが適切かな。
人によっては他の翻訳もありうると思う。

>このスタイルを弁護しておくと...

そういうスタイルがあることは最近知った。
前スレで出てきたLaw and Order in Algorithmicsってpdf内が
そういう流儀だったしおかしくはない。
でも、個人的に同一カテゴリー内の射(a -> a, IO a -> IO a)
なら「有り」だとは思うけど、fmapとliftMの場合そうやっちゃうと
ファンクタとかリフトって概念を持ち出す意味がなくなる。

>加えて、それを言い出すと(>>=)だって圏論的には一引数の演算なんじゃないか、とか。

圏論的には(>>=)は概念的にfmap,liftMの持つ概念と別種。
(といいつつそこらへんはよくわかっていないからどうともいえない
というのが本音。別種であるのは確か)
275デフォルトの名無しさん:2006/12/09(土) 22:23:20
>calcの例は理解できなかった。せっかく説明してもらったのにすまん。

>圏論の観点からは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
そういうこと。そしてそれがファンクタの概念。
経験的にわかっていることならこの際明確にしてしまおう。
276デフォルトの名無しさん:2006/12/09(土) 22:25:37
なんかえらそうに書いてしまったが
これはすべて個人的な勝手な解釈だ。
277デフォルトの名無しさん:2006/12/09(土) 22:41:30
なんかレスくれ。いろいろと穴はあると思うし。
278デフォルトの名無しさん:2006/12/09(土) 23:04:44
>>275
>みたいなかんじに使えないかと。
つまり、IOならIOについて(fmap calc)をひとかたまりとみなすべきであり、
そういうスタイルを奨励するためにcalcIOという名前を付ける、ということか。逆に
do x <- a; b (calc x)
のようにcalcの適用をdo式中に散逸させたりすると、
この構造がわかりにくくなるので良くない、と。
ただ、相変わらずこのように書くことの現実的利益がわからない。
>構造だけは同一で元となっている
>カテゴリーだけが違うということが明確になっていいんじゃないかと
>思っている。
の部分。

>経験的にわかっていることならこの際明確にしてしまおう。
もちろん明確にするのは価値があると思うし、そういうのは
個人的に好きな方向性だけど、もともとの議論に関して
「圏論を知らないとHaskellを使うのにどれくらい支障があるか」という点については、
はっきりさせておきたかった。俺としてはHaskelll(のような言語)が
真に一般に普及してほしいと思っているので、経験だけではカバーできない
重大な困難があるかどうかが気になった。
279デフォルトの名無しさん:2006/12/09(土) 23:52:51
>>278
>つまり、IOならIOについて(fmap calc)をひとかたまりとみなすべきであり、
>そういうスタイルを奨励するためにcalcIOという名前を付ける、ということか。

いや、そこまで強くは言っていない。名前付けたのはわかりやすくするためで
>>273みたいな名前付けない使い方が一般的だと思う。
というか経験的にすでにわかってることなんだと思う。

>ただ、相変わらずこのように書くことの現実的利益がわからない。

考えを整理できるとかそういう部類で現実的利益といわれると無いね・・・。

>「圏論を知らないとHaskellを使うのにどれくらい支障があるか」という点については、
>はっきりさせておきたかった。俺としてはHaskelll(のような言語)が
>真に一般に普及してほしいと思っているので、経験だけではカバーできない
>重大な困難があるかどうかが気になった。

Haskell使用するというレベルでは圏論の知識の有無による
困難は表面的には無い。が根源的には結構困難があると思う。
おそらく人のコードを読むという段階であらわに出てくるハズ。
fmapにしたってファンクタの概念をつかって圏論チックな考え方で
使おう思っている人と、そうじゃない人だと使い方が違う。
そういうのが積み重なって人によってはその書き方の意図が
読めないコードというのが出てくると思う。
そういう意味では結構困難がある。
まぁ要するにコーディングスタイルの問題。
圏論的なものを取り入れたHaskellコーディングスタイルを確立する
のかあくまで経験的なコーディングスタイルを確立するのか。

うーむ。なんだかグダグだになってしまった。
とりあえずfmap,liftMは便利じゃね?ということを
最初は説明したかったんだがものすごく言葉足らずでスマン。
280デフォルトの名無しさん:2006/12/10(日) 00:39:38
>>279
「現実的利益」なんて嫌らしい言い方をしたが、ようするに
「それで何がうれしいのか」を聞きたかっただけだった。
「考えを整理できる」というので十分。
>考えを整理できるとかそういう部類で現実的利益といわれると無いね・・・。
圏論的な考え方を身につけた人にとって考えを整理しやすい書き方、ということでいいだろうか。

>Haskell使用するというレベルでは圏論の知識の有無による
>困難は表面的には無い。が根源的には結構困難があると思う。
>おそらく人のコードを読むという段階であらわに出てくるハズ。
いいたいことはたぶん分かった。もちろん実感として分かるわけじゃないので
自信を持って理解したとはいえないが。
俺としては、「表面上」支障がなければそれで十分だと思う。
例えばライブラリを提供する/使うだけならスタイルの不一致は問題にならないし。

しかし冷静に考えると、表面上支障がないというのは誰に聞くまでもなく俺が
身を持って知っていることだった。これじゃ何が聞きたかったのか分からん。
結局聞きたかったのは「圏論ってそんなにすごいの?」だったような。
ぐだぐだ

>とりあえずfmap,liftMは便利じゃね?ということを
>最初は説明したかったんだがものすごく言葉足らずでスマン。
とんでもない。言葉の通じない相手に長々付き合ってくれたことに感謝。
281239:2006/12/10(日) 01:04:10
>>243
うん
それ読んでもつまらない
まだ早いようだ
282デフォルトの名無しさん:2006/12/10(日) 01:33:40
f `fmap` a
は後置演算子と考えればOK。
つまり
(f `fmap`) a
283デフォルトの名無しさん:2006/12/10(日) 11:18:22
>>280
>圏論的な考え方を身につけた人にとって考えを整理しやすい書き方、ということでいいだろうか。

まぁせっかく勉強したんだから使っていこうじゃんという気持ちも大きい。

>俺としては、「表面上」支障がなければそれで十分だと思う。
>例えばライブラリを提供する/使うだけならスタイルの不一致は問題にならないし。

その通りだと思う。ただ圏論の概念の名前を冠した射(ファンクタ、リフトetc..)は
(個人的に)理解して欲しい。
ちゃんとそういう名前がついているわけだし。

>結局聞きたかったのは「圏論ってそんなにすごいの?」だったような。

実際的な利益はほとんど無いんじゃないかと思う。
一般的抽象のナンセンスといわれるようにすごくないと感じる人も
いて全然おかしくない。個人的な価値観の問題なのかな。

ただ、モナドに関する情報の中でどれが有意義な議論なのか
見分けることができるようにはなった。
あと、うまくいえないがしっくりとする。
なんかしっくりとこないなぁというひとはちょっとやってみると
いいんじゃなかろうか。
284デフォルトの名無しさん:2006/12/10(日) 14:48:03
>>282
スマン寝ぼけて無視してた。
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は関数ではない。「関数」に作用する「作用素」と
見るべきだから中間演算子として使うのはダメ。
というのではどうですか。
285デフォルトの名無しさん:2006/12/10(日) 14:59:31
なんか変なことかいてしまったかも。

まぁfunctionって意味が広いんだよ。
それを全部functionという単語の元
素朴な関数概念で置き換えちゃうから・・・。

うーん。自分でいっててよくわからん。
真偽は自分で考えてくれ。
286デフォルトの名無しさん:2006/12/10(日) 16:36:52
圏論を知っても頭は整理されない、ということだけはわかった
287デフォルトの名無しさん:2006/12/10(日) 17:02:27
確かにね、否定できんな。
まぁグダグダだしね
288デフォルトの名無しさん:2006/12/11(月) 13:01:48
関数型超初心者なんですが、圏論を使うとプログラムとかでこんなにエレガントになるという例とかってありますか?
289デフォルトの名無しさん:2006/12/11(月) 16:39:02
すみません、こちらはもっとベタな質問なのですが、
HaskellのFunctorと、C++のファンクタって、何か関係がありますか?
C++のファンクタは、単なる呼び出し可能のオブジェクトなのですが。
290デフォルトの名無しさん:2006/12/11(月) 16:44:04
あと、これも非常に低レベルな質問です。
http://itpro.nikkeibp.co.jp/article/COLUMN/20061005/249933/

この連載を少しずつ読んでいるのですが、
fmapがあればmapは要らないような気がします。なぜmapが残っているのでしょ
うか?
291デフォルトの名無しさん:2006/12/11(月) 18:13:45
>>289
どちらも語源がfunctionである、という以上の繋がりはないと思う。
292デフォルトの名無しさん:2006/12/11(月) 20:02:35
じゃあHaskellのファンクタとOCamlのファンクタは関係ある?
289じゃないけど便乗。
293デフォルトの名無しさん:2006/12/11(月) 20:27:22
C++のファンクター、カンケネー♪
OCamlのファンクター、カンケネー♪
294デフォルトの名無しさん:2006/12/11(月) 21:10:57
OCaml のファンクタも Haskell のファンクタも、圏論のファンクタ(関手)を
ベースにした概念という意味では関係がある。
C++のファンクタはまた違う語源のものなので関係ないという話をどこかで読んだことがある。
295289:2006/12/11(月) 21:16:52
皆さん、ありがとうございます。
C++とは関係ないのですね。しきりに首をひねっておりました。
296デフォルトの名無しさん:2006/12/11(月) 23:01:06
俺も質問させてください。
words関数やlines関数の実装で、リストのリストを返す方法がわかりません。
"hello world" を引数に取って["hello","world"]と返す関数はどのように実装したらいいでしょうか
297デフォルトの名無しさん:2006/12/11(月) 23:03:54
f "hello world" = ["hello","world"]
f _ = []
298デフォルトの名無しさん:2006/12/11(月) 23:13:34
299デフォルトの名無しさん:2006/12/12(火) 09:22:19
300デフォルトの名無しさん:2006/12/12(火) 12:25:47
>>290あの記事を理解できる時点で低レベルじゃない
301デフォルトの名無しさん:2006/12/12(火) 17:03:37
>>290
互換性のために残ってるのだと思う。
単相性制限があるから、単純にmapをfmapに置き換えることは出来ない。
302289:2006/12/12(火) 17:25:36
>>298
おお!向井さんの所でまとまっていたとは!

>>300
いや、私には難しいので、読むのにすごく時間がかかります。
だけど、入門Haskellのモナドまでを読めば、何とか理解できる範囲だと思います。
圏論の全く分からない私にはありがたい連載です。
何より、とても面白いと思います。

>>301
やはり過去互換性ですか。単相性制限?が分かりませんが、だからfmapという
新しい名前を作る必要があったのですね。
303デフォルトの名無しさん:2006/12/14(木) 11:38:37
質問です
Visual Haskellをインストールしようとしたところ、
WindowsHostScriptで「Failed to setup vs_haskell.dll」というエラーが出たのですが、
これを解決する方法はありませんか?
よろしくお願いします。
304デフォルトの名無しさん:2006/12/15(金) 02:29:08
使うな。
305デフォルトの名無しさん:2006/12/15(金) 07:20:19
ありがとうございます。
解決しました。
306デフォルトの名無しさん:2006/12/15(金) 10:53:23
>>304-305
自作自演乙
307デフォルトの名無しさん:2006/12/15(金) 22:38:25

map関数がわからん
使うだけなら簡単なんだけど、型の宣言がつじつま合わないというか
とにかく納得できない

ふつうの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???
308デフォルトの名無しさん:2006/12/15(金) 22:51:17
>>307
a->bはaを受け取ってbを返す関数の型。
mapは「aを受け取ってbを返す関数」とaのリストを受け取って、bのリストを返す関数。
a->bにあたるのはsquareだけだよ。
309デフォルトの名無しさん:2006/12/15(金) 23:00:55
Haskel 全く知らんけど、それって

map :: (a -> b) -> ( [a]  -> [b] )
(map square) [1, 2, 3]

ってこと(文法も知らんが)?
310307:2006/12/15(金) 23:53:33
>a->bにあたるのはsquareだけだよ。
ソウイウコトカ!!!
スッキリー、スッキリ-
311デフォルトの名無しさん:2006/12/15(金) 23:56:33
>>309
そうそう。haskellの多変数関数は関数を値とする一変数関数。
文法もそれでもあってるはず。
312デフォルトの名無しさん:2006/12/16(土) 13:01:08
ところでkleisliの読み方がわからないんですがクライスリ?
313デフォルトの名無しさん:2006/12/16(土) 16:38:02
Hugsのcompile.cなど一部のC source fileは
-O2無しでcompileされるようにMakefileinが書かれているけど
C compilerの最適化の副作用を避けるため等のなにか理由がある?
314デフォルトの名無しさん:2006/12/16(土) 23:10:46
どうだろう。
変数がレジスタに乗ってしまってメモリ上から消えると、
GCを前提とした言語処理系では問題になることがあるみたいだが。
315デフォルトの名無しさん:2006/12/17(日) 09:47:59
>>314
それはない。
しかし、レジスタ上だろうがメモリ上だろうが、変数が元の値ではなく
加工された値でしか存在しないという状況はあり得て問題になる。
316デフォルトの名無しさん:2006/12/17(日) 16:10:40
>>313-315
ある特定の処理系の組み合わせで問題が起きることはあるかもしれないが、
常に問題が起きるってことはない。ソースコードが間違えていないなら、ね。
ソースコードは間違えているけど「ある処理系では問題が起きない」てのは
よくある話。

-O2の付け忘れでなければ、まずいコードになっているのかも?
317デフォルトの名無しさん:2006/12/17(日) 21:48:39
volatile は役に立たんのけ?
318デフォルトの名無しさん:2006/12/17(日) 22:17:14
>>317
役に立つ。というか必要なところにvolatileがないのはダメだろ。
スレ違いなんでこのへんで
319デフォルトの名無しさん:2006/12/18(月) 23:32:54

だれかHaskellの再帰について教えて
くわしく、わかりやすく、ていねいに
320デフォルトの名無しさん:2006/12/18(月) 23:53:40
aaa :: Int -> Int
aaa a = aaa (a+1)
321デフォルトの名無しさん:2006/12/19(火) 00:01:57
let
  空 = 色
  色 = 空
in Data.Set.singleton 空
322デフォルトの名無しさん:2006/12/19(火) 00:07:22

わからん
おまえの説明はまったくわからん大滝 秀治)
323デフォルトの名無しさん:2006/12/19(火) 01:01:50
再帰という概念がわからないのか、それとも Haskell における再帰の取り扱いがわからないのか、どっち?
324デフォルトの名無しさん:2006/12/19(火) 01:16:38
Javaの再帰はいちおう書ける
スマンがねる
良レスに期待
325デフォルトの名無しさん:2006/12/19(火) 09:06:05
期待されても困るよ(笑)
というか、再帰のプログラムが書けるのなら、なおさら何が疑問なのかがわからん。

http://www.shiro.dreamhost.com/scheme/docs/tailcall-j.html
とかでどうだ。Haskellじゃないけど。
326デフォルトの名無しさん:2006/12/19(火) 16:44:17
>>324
とりあえず、再帰を身体にしみこませる必要があると思うんだ。

Little Schemer
http://www.amazon.co.jp/exec/obidos/ASIN/0262560992

Scheme手習い(上記の本の邦訳。入手困難)
http://www.fukkan.com/fk/VoteDetail?no=6462

Haskellはそのあとでも十分。
327デフォルトの名無しさん:2006/12/19(火) 17:07:27
再帰を身体にしみこませるのにHaskellを使わない理由があるのか?
328デフォルトの名無しさん:2006/12/19(火) 17:16:33
prolog
329デフォルトの名無しさん:2006/12/19(火) 17:42:59
325を読んで疑問に思ったのだが、
hoge 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が最後の処理だから末尾再帰じゃない、っていう解釈をするのかな?
330デフォルトの名無しさん:2006/12/19(火) 17:49:28
>>329 hoge2 は末尾再帰ではない.
331329:2006/12/19(火) 19:13:04
>>330
ありがとう。
それにしてもレスが速いな(・∀・;)

ついでだから実行速度を測ってみた。
最適化しないとhogeの方が若干速いが、-Oをつけると同じ速さになる。
なんか切ないな
332デフォルトの名無しさん:2006/12/19(火) 19:32:06
>>331
Haskell では末尾再帰について特に大きなメリットはない。
普通は末尾再帰は逐次計算していけるのから嬉しいのだが、
Haskell は最外簡約を取るので、逐次計算は行われない。
333デフォルトの名無しさん:2006/12/19(火) 19:48:33
>>332
>Haskell では末尾再帰について特に大きなメリットはない。
そんなことはないと思うが。
Haskellは常に最外簡約というわけではないし
(GHCは正格性解析の結果に基づいて簡約順序を決める)、
最外簡約の場合でも、クロージャを作って別の関数に渡す代わりに
直接呼んでしまえるのでコストが小さい。
334デフォルトの名無しさん:2006/12/20(水) 01:39:23
なぁなぁ、教養科目で記号論理学だけやったんだが。
推論規則の演習とかやった記憶もかすかにあるんだが。
圏論とかサパーリ。
もとが哲学寄りの文学屋なので、そっち方面の記号論は、まぁわかるんだが。
そんな俺様にお勧めのHaskell文献があったら教えてください。
335デフォルトの名無しさん:2006/12/20(水) 01:54:26
Haskell文献?それって言語解説書?
336デフォルトの名無しさん:2006/12/20(水) 01:55:04
テンプレにあると思うが。
337334:2006/12/20(水) 02:01:53
>335
ごめん。言語解説書ではなくて、背景の理論のほう。
とりあえず俺の勉強したなけなしの記号論理学が
どこをどう通ったらHaskellになるのか見てみたい。
338デフォルトの名無しさん:2006/12/20(水) 02:06:18
>>337
まず、歴史的にはMLの方が先だから、MLから入ってみたら?
339デフォルトの名無しさん:2006/12/20(水) 05:01:09
>>337
PierceのTAPLでも嫁
それが理解できなければどうせその先も理解できない
340デフォルトの名無しさん:2006/12/20(水) 06:22:58
HASKELLってほんとに綺麗だよね。
いつかみんながHASKELLを使う世の中がきたらいいな。
341デフォルトの名無しさん:2006/12/20(水) 07:31:12
ひとつお聞きしたいのですが、
Haskellerで元Lisperの方ってどれくらいいるんでしょうか?

元Lisperの方でHaskellに移ってきた方は、Haskellのどのあたりに惹かれました?
342デフォルトの名無しさん:2006/12/20(水) 08:04:58
LISPはスーパーな人が沢山いて、敵う気がしなかった。
Haskellはまだ大半が素人みたいなので鞍替えした。
343デフォルトの名無しさん:2006/12/20(水) 11:15:15
>>341
Haskellを知っている人ならほぼ確実にLispも知ってるよ。
344デフォルトの名無しさん:2006/12/20(水) 11:25:49
俺 Lisp は知ってるけど Lisper じゃないな
345デフォルトの名無しさん:2006/12/20(水) 11:30:54
言語の違いでプログラマが変わるわけでもあるまい
346デフォルトの名無しさん:2006/12/20(水) 11:54:30
用途によっていくつかの言語使い分けるから、何々erではないな
347デフォルトの名無しさん:2006/12/20(水) 14:37:22
>>337
Haskel は全く知らんけど、その記号論理学とはあまり関係無いんじゃないか?

Lisper 以外の大半人たちは高階の理論を記述する際に階によって用語を使い分ける。
ので集合とか射とか群とか圏とかいろんな言葉が出てくるわけだけど、
やってることはλと(暗黙の)括弧が多いか少ないか程度の違いのような気がするので、
そう大上段に構えるほどの物じゃないような・・・
348デフォルトの名無しさん:2006/12/20(水) 14:40:39
あまたあるプログラミング言語の一つ
349デフォルトの名無しさん:2006/12/21(木) 00:41:18
>>341
9割が両刀
1割は悪い人にだまされて最初の言語がHaskellというケース
350デフォルトの名無しさん:2006/12/21(木) 01:14:50
Lispを最初にやってたほうがいいんかな?
Haskellだけでも十分おもしろいけど。
351デフォルトの名無しさん:2006/12/21(木) 01:17:52
>>349
C++からLispを経由せずにHaskellをやりだした者ですが、
私をだました悪い人はどこですか?
352デフォルトの名無しさん:2006/12/21(木) 01:41:26
Javaだけなんとかギリギリできるけど
Haskellも勉強してるよ

オブジェクト指向しか知らない世代なわけだけど
そこに固まらないうちに関数型も慣れときたいなぁと思って
353デフォルトの名無しさん:2006/12/21(木) 01:58:04
先輩が Lisper で、静的型と動的型の違いを勉強するために Haskell も合わせて
勉強するように言われました。
354デフォルトの名無しさん:2006/12/21(木) 01:59:43
>>350
関数型言語習い始めだと、副作用なしというプログラミングスタイルは辛いと思う。
まずは副作用ありの関数型言語で慣れておくと良いと思う。
355デフォルトの名無しさん:2006/12/21(木) 02:50:42
>関数型言語習い始めだと、副作用なしというプログラミングスタイルは辛いと思う。
議論することじゃないが、俺はそうは思わない、という意見だけ表明しておく。
356ド素人:2006/12/21(木) 02:53:37

盛り上がってるとこ悪いんだけどくだらない質問
精製されたexeファイルをGHC入れてない人に実行させるにはどうすりゃいいの?

main = print $ map square [2, 5, 3, 1, 10]
square n = n * n

たとえば↑みたいなプログラムをexeにしたって実行できないよね?
どういうのならできるんだ???
357デフォルトの名無しさん:2006/12/21(木) 02:54:35
Lisp出来る人から見てHaskellの優れてるとこってどこ?
逆にLispのほうが優れてると思うところは?
358デフォルトの名無しさん:2006/12/21(木) 06:27:28
>>356
問題なく実行できる。

exeファイルをダブルクリックしたけど一瞬だけコマンドプロンプトが開いてすぐに閉じたから実行できなかったと思ったんじゃないの?
それだったらgetCharでも付けて入力待ちさせりゃいい。
main = do { print $ map square [2, 5, 3, 1, 10]; getChar }
square n = n * n
359デフォルトの名無しさん:2006/12/22(金) 00:46:51
低レベルな質問2
main = do cs getContents
       putStr cs

exeファイルにしてコマンドプロンプトで下のように実行しようとしてもできない
ghc out.hs -o out
out 引数(文字列)

なんで?
ふつうのHaskellプログラミングには
実行するには Ctrl - Z + Enter って書いてるけど、これどういう意味?
360デフォルトの名無しさん:2006/12/22(金) 01:04:25
>>359
そのぷろぐらむだと引数は関係ない。
outを実行すると入力待ちになるから、適当な文字列を何行かタイプする。
入力を終了したくなったら、まず、カーソルが行頭にある状態で
Ctrlとzを同時押しして(^Zという表示が現れるはず)、
つぎにEnterキーを押せば良い。
361デフォルトの名無しさん:2006/12/22(金) 08:44:55
>>357 どっちもイイね。
Haskell の優れてるところ: 型システムによる安心感、純粋関数型なところ
Lisp の優れてるところ: マルチパラダイムなところ、あんま理屈とか考えずに言語を気軽にカスタマイズできるところ
362デフォルトの名無しさん:2006/12/25(月) 11:44:14
>>357
使い方次第
363デフォルトの名無しさん:2006/12/25(月) 18:05:58
>>362
日本語でおk
364デフォルトの名無しさん:2006/12/25(月) 20:14:12
>>361
Haskellの優れているところ:遅延評価、モナド
365デフォルトの名無しさん:2006/12/25(月) 22:18:13
Haskellの劣っているところ:遅延評価、モナド
366デフォルトの名無しさん:2006/12/25(月) 23:05:14
遅延評価は言語の進化過程で最新の部類だぞ・・
367デフォルトの名無しさん:2006/12/25(月) 23:19:58
モナド(というかdo記法)大好き。
優れているかは別として、Haskellでいちばん好きな機能かも。
368デフォルトの名無しさん:2006/12/25(月) 23:59:33
なにが遅延評価だ
ここはもうビチョビチョじゃねーか
369デフォルトの名無しさん:2006/12/26(火) 00:21:36
>>367
doは>>=を使うよりも見栄え良く書けるが、
代入型言語の特徴を残す記法なので、
不満に思う人も多いと思う。
370デフォルトの名無しさん:2006/12/26(火) 00:54:35
>>369
似たような意見をwebで時々見掛けるが、よく理解できない。
命令的プログラミングをしたいとき、それに適した構文を
使えるのだから、単純に良いことのように思える。
それとも、命令的プログラミングをサポートしない言語の方が
良いという考えなんだろうか。
371デフォルトの名無しさん:2006/12/26(火) 01:29:44
>>370
「関数」で統一された世界を作れば、何か良いことがあるに違いない
(古風な言い方である自動プログラミング、とか、構造の視覚化がしやすくなる、とか、etc..)
と思う人が多いからじゃないかな?
372デフォルトの名無しさん:2006/12/26(火) 01:31:33
373デフォルトの名無しさん:2006/12/26(火) 02:48:41
自分はどするよりコンビネータでモナモナする方がいいな。
374デフォルトの名無しさん:2006/12/26(火) 14:22:41
どするって流行らせたいの?w
375デフォルトの名無しさん:2006/12/26(火) 22:44:22
>>=は横に長くなっちゃうのがいまいちだけど、見た目がかっこいいからついつい使ってしまう
376デフォルトの名無しさん:2006/12/27(水) 00:03:09
do {
a <- hoge;
hoge2 a;
hoge3 a
}



hoge >>=
\a ->
hoge2 a >>
hoge3 a

どっちがみやすいですか?
377352:2006/12/27(水) 01:44:38
>>372
この記事おもしろいねw

真実だとしても、結局のところ今はPCの性能の上昇とか
言語自体の進化によってオブジェクト指向は機能的で合理的な言語になってるよね?

たしかに、
「あるプロジェクトのコードを再利用した話なんて聞いたことない」とか、
「正しく継承させるためには設計だけでCの3倍もの時間かかる」とか、
超笑えるねw

当たり前に思ってきた(教えられてきた)コトって、
そのまま信じちゃうからこういう記事読むとオラ、ワクワクしてきたぞ
378デフォルトの名無しさん:2006/12/27(水) 02:04:04
Haskellだと10倍の時間をかけて10分の1の行数ですみます。
379デフォルトの名無しさん:2006/12/27(水) 02:05:25
数十万行のsoftware開発してきた身からすると
あの内容はあながち冗談に思えなくて泣けてきた。
彼がinterviewであんなこと言うはずは無いだろうけどさ
380デフォルトの名無しさん:2006/12/27(水) 02:32:15
>>378
チャッチャと書けるようになったらダイブ頭よくなってるかな?
381デフォルトの名無しさん:2006/12/27(水) 03:01:21
何を創ったかによるだろ
382デフォルトの名無しさん:2006/12/27(水) 03:12:31
だよなー
もっとHaskeりたいんだけど、やさしく教えてくれるかわいいコいないかな
383デフォルトの名無しさん:2006/12/27(水) 03:14:55
ギャルにHaskellは引かれるだけ
禁句だ。
384デフォルトの名無しさん:2006/12/27(水) 22:11:40
アホか
Haskellを教えてくれるギャルを探すんだよ
385デフォルトの名無しさん:2006/12/27(水) 22:47:06
                 ∩
                 | |
                 | |
        ∧_∧   | |  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       ( ´Д`)//  < ⊥が返ると思います!
      /       /    \        
     / /|    /        ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  __| | .|    |
  \   ̄ ̄ ̄ ̄ ̄ ̄ ̄\
  ||\             \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              || 
386デフォルトの名無しさん:2006/12/30(土) 22:17:23
正直、Haskellってオサレだと思うんだけどなぁ。
少なくともVBやJavaやってるよりは確実にイケテルよね?

モナドとかラムダとか遅延評価について語るだけでモテモテな世の中になればいいのに。
387デフォルトの名無しさん:2006/12/30(土) 22:50:41
>>386
俺もそう思う。

思いたい。
388デフォルトの名無しさん:2006/12/30(土) 23:04:43
HaskellとConcurrent Cleanはオサレ言語だと思う。思いたい。思わせろ。


普段は泥臭いPerl使ってる俺は死んだらいい。
389デフォルトの名無しさん:2006/12/30(土) 23:06:56
オサレって言葉はいつから誉め言葉になったんだ?
390デフォルトの名無しさん:2006/12/30(土) 23:47:59
俺的な言語の分類。主観のみで書いたので脊髄反射は厳禁w

■オサレ言語
Haskell、Clear、その他の純粋関数型言語

■普通の言語
C、C++、C#、アセンブラ、PHP、Perl、awk

■キモい・胡散臭い
Ruby(特にRails界隈)、Ajax、XML、Paython、その他Web2.0に絡む言語すべて

■オッサン専用
COBOL、FORTRAN、PASCAL

■厨言語
Java、VB、BASIC、HSP
391デフォルトの名無しさん:2006/12/31(日) 00:07:22
lispわー?
392デフォルトの名無しさん:2006/12/31(日) 01:02:19
>390を勝手に書き換えてみる

■オサレ言語
Haskell、Concurrent Clean、その他の純粋関数型言語

■普通の言語
C++、C#、Java、VB.NET

■泥臭い
Perl

■ハッカー専用
C、アセンブラ、awk、Python

■キモい・胡散臭い
PHP、Ruby

■オッサン専用・過去の遺物
COBOL、FORTRAN、PASCAL

■厨言語
VB、BASIC、HSP、Delphi

■宗教
Lisp、その他Lisp系統
393デフォルトの名無しさん:2006/12/31(日) 01:06:40
coolLang = [Lisp, Scheme] :: [Language]
394デフォルトの名無しさん:2006/12/31(日) 01:49:49
(set! coolLang (cdr coolLang))
395デフォルトの名無しさん:2006/12/31(日) 09:30:38
最近になって Haskell を触り始めたんだけど、
C で言う != みたいな記号ってないん?

環境は WinHugs 使ってる。
396デフォルトの名無しさん:2006/12/31(日) 10:37:39
>>390
HSPは胡散臭い言語だと思います。
397デフォルトの名無しさん:2006/12/31(日) 10:43:32
>>395
(!=) :: Eq a => a -> a -> Bool
(!=) = (/=)
398デフォルトの名無しさん:2006/12/31(日) 13:12:31
Rails は確かに胡散臭い
あと perl はなにげにハッカー言語だと思う
399デフォルトの名無しさん:2006/12/31(日) 13:25:47
>>398
ハッカーが「つくっている」≠ ハッカー言語
400デフォルトの名無しさん:2006/12/31(日) 13:35:02
いや、ハッカーが使う言語ってのは泥臭いものだよ
そう言う意味で C やアセンブラは納得できるけど Python はどうかなぁ
401デフォルトの名無しさん:2006/12/31(日) 16:51:27
402デフォルトの名無しさん:2006/12/31(日) 19:23:05
Haskellって日本語を表示させたりは出来ないんでしょうか?
main = putStrLn "こんにちは!"ってやるとエラーになるんですけれど・・・
あきらめるしかないんでしょうか?
403デフォルトの名無しさん:2006/12/31(日) 22:24:01
>>397
ありがとう
404デフォルトの名無しさん:2007/01/01(月) 10:53:25
GHC 6.6 で部分的に UTF-8 に対応したみたいだけど、
putStrLn とかはまだ未対応みたいね。
405デフォルトの名無しさん:2007/01/01(月) 13:46:12
>>402
Hugsだと動く。
406デフォルトの名無しさん:2007/01/01(月) 23:29:56
日本語を出力できないのかよ!って思ったけど、プログラムにべた書きしてある場合がだめなのね。
407デフォルトの名無しさん:2007/01/01(月) 23:41:17
>>402
EUC環境なら普通にできるよ。
408402:2007/01/02(火) 00:02:38
みなさん、ご返答有難うございます。
>>405
ネイティブなバイナリを作りたいんです。
>>406
標準入力から入力した文字を処理させたいんです。
出来るでしょうか?
>>407
windowsマシンしか持ってないんです・・・
409デフォルトの名無しさん:2007/01/02(火) 00:23:32
> 標準入力から入力した文字を処理させたいんです。
ただのバイト列としての扱いになるけど一応読み込めて表示できる。
410デフォルトの名無しさん:2007/01/02(火) 14:03:50
>>406
逆。プログラムには埋め込めるけど入出力ができない。

>>408
http://yogimo.sakura.ne.jp/ssc/index_ja.html
外部ライブラリだけど、とりあえず日本語の入出力はできる。
411デフォルトの名無しさん:2007/01/02(火) 16:04:51
なんか混乱気味だなぁ。

GHC6.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が紹介しているライブラリはそう言った処理を行ってくれる。
412デフォルトの名無しさん: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でリテラルを直に
書くことはできない。

(続く)
413デフォルトの名無しさん:2007/01/02(火) 17:49:24
(続き)

3.最近の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)が正しく動作しない。
414デフォルトの名無しさん:2007/01/03(水) 00:32:02
415デフォルトの名無しさん:2007/01/03(水) 01:24:37
お前ら、開発に加わって連中に国際化を教えてやってください
416デフォルトの名無しさん:2007/01/03(水) 02:49:12
ずーっと昔のemacsとかXwindow systemみたいだねぇ。
417デフォルトの名無しさん:2007/01/03(水) 10:33:09
GHCのコアな開発者(少なくともSimon Marlow)は問題を理解してるよ。
問題はむしろSystem.IOを書き直すのが(重要度の割には)面倒だ、というところに
あるんじゃないかと。
418デフォルトの名無しさん:2007/01/03(水) 11:02:51
質問です。
1関数とアクションは何が違うのでしょうか?
2square n = n*n
というのはnを引数とする関数を定義しているんですよね。
cみたいにn = n*nという代入を表しているんじゃないですよね?(説明が難しい)

419デフォルトの名無しさん:2007/01/03(水) 12:00:08
>>418
1. アクションとはIO aを返す関数のことです
2. まずは、squareの型を見てみましょう。
square :: Num a => a -> a
ということですから、代入ではありません。
420デフォルトの名無しさん:2007/01/03(水) 12:00:50
"IO a"は型ね。
421デフォルトの名無しさん:2007/01/03(水) 12:09:36
1. アクションは副作用を含むことのできる一連の処理を値(IO a 型)として返す関数。
  main 関数の返す値が最終的に実行される。
  Perl や JavaScript で、プログラムを内部的に文字列として生成して、
  最後に eval で実行するような状況に少し似てる。

2. 関数 square n と n*n とが等値であることを定義しているだけ。
  数学では = ってのは左辺と右辺が等しいことを表すよね。
  x + 2y = 4 とか、f(x) = 2x + 1 とか。あれと同じ。
422デフォルトの名無しさん:2007/01/03(水) 12:13:31
>>419
>アクションとはIO aを返す関数のことです
アクション(動作)はIO a型の値のことじゃないか?
たとえばputStrは文字列を取って動作を返す関数。
putStr "Hello"は動作。
423デフォルトの名無しさん:2007/01/03(水) 12:48:55
>>422
プログラミング指向の論文を読んでいると、
引数または返値に"IO a"を含むものをfunctionとは呼ばずにactionと呼んでいる事が多いので、
そう書いたんだよ。
424デフォルトの名無しさん:2007/01/03(水) 12:50:08
あ、ごめん、>>422の方が正しそう
425デフォルトの名無しさん: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;とは別なんですよね?
426デフォルトの名無しさん:2007/01/03(水) 13:10:07
アクションのことはおっしゃってることは良く分からないですけど
IOっていうのが味噌なんですね。
それとcのプログラム、関数宣言してないですけど、許してください。
427デフォルトの名無しさん:2007/01/03(水) 13:41:21
>>425
意味的には似てるけど、
たとえば、Cではsquare(2)とすれば、それがその場で実行されて4という値として扱われるけど、
Haskellでは(square 2)そのものとして扱います。

まず、IO a -> a という事はできません(IOがいったんくっついたら取り外すことはできないの)ので、
Haskellではmainを評価することで実行されますが、
最終的にはmainまで … -> IO aというのを続けて書いていかないとダメなの。
main関数の型は main :: IO () ですよね。
428デフォルトの名無しさん:2007/01/03(水) 13:42:50
>>425
square 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
429デフォルトの名無しさん:2007/01/03(水) 22:39:29
func x = func x
main = do func 1

これ ghc だと通ったんですけど、この場合の func の型は何ですか?
430デフォルトの名無しさん:2007/01/03(水) 23:54:51
t -> t1
431デフォルトの名無しさん:2007/01/04(木) 00:50:26
>>422
よく参照されるやさしい Haskell 入門ですら、
関数自身の事を表す事もあれば、値を表す事もあるんだよな。
http://www.sampou.org/haskell/tutorial-j/io.html

例えば、7.1 の最初の文
>各 I/O のアクションはそれぞれ値を返します
は関数自身をアクションと呼んでるように見えるし、
その直後の
>これはアクションを他の値と区別するためです
は値をアクションと呼んでるように見える。

どちらもアクションと呼ぶのか、それともいい加減なだけなのか。
どっちなんだろ?

>>425
square n が n * n と等値。
無意識に square と n の間に理解の区切りを設けてるみたいだけど、
そんなものはないと考えた方がいい。
432425:2007/01/04(木) 16:24:19
うぉー、皆さん回答本当に有難うございます。
square n = n*nは理解できました!
関数squareは仮引数nを一つとる関数で、その本体はn*nという理解でよいんですね。
関数とアクションの違いは、まだ勉強不足で理解は出来ていないですけど、
IOが味噌なのは分かりました。
話は変わりますけど、文字列が文字のリストなんて、HaskellはCみたいですね。
433デフォルトの名無しさん:2007/01/04(木) 18:40:30
リストと配列は違うよ。
434デフォルトの名無しさん:2007/01/05(金) 14:06:19
>>433
すいません、配列とリストって何が違うのでしょうか?
調べてみたんですが良く分かりませんでした。
例えば
# include <stdio.h>
int main (void)
{
char *string = { "Hello"};

printf("%c\n",string[2]);

return 0 ;
}
みたいにリストって言うのは、配列とポインタの組み合わせとその操作と思っていたんですけれど
違うのでしょうか?
435デフォルトの名無しさん:2007/01/05(金) 14:27:30
Lisp以前の問題
436デフォルトの名無しさん:2007/01/05(金) 15:04:12
>>434
Haskellでいうリストは「単方向リンクリスト」のこと。
437デフォルトの名無しさん:2007/01/05(金) 15:41:32
なんか Haskell 勉強する前に勉強しなきゃいけないことがありそうな感じの人だ
438デフォルトの名無しさん:2007/01/05(金) 16:05:39
Haskellを勉強するのに配列とリストの違いを知っている必要もないような。
439デフォルトの名無しさん:2007/01/05(金) 16:08:13
>>434
実際のリストは、こんな感じのデータ構造を
適当につなぎ合わせて作られている。

struct Object {
    enum {PAIR, INTEGER, STRING} type;
    union {
        struct {struct Object *head, *next;} pair;
        int integer;
        char *string;
    } body;
};
440デフォルトの名無しさん:2007/01/05(金) 16:09:53
441デフォルトの名無しさん:2007/01/05(金) 16:21:40
>>439
それは余りに違いすぎないか?
型タグはない実装が多いだろうし、その定義だと遅延しない。
442デフォルトの名無しさん:2007/01/05(金) 16:24:43
リストの中身はイテレータ。
443デフォルトの名無しさん:2007/01/05(金) 16:39:23
>>441
頭の中のモデルとしてはこれで十分。

っていうか、実装の話をしだしたらキリがないだろ
444デフォルトの名無しさん:2007/01/05(金) 16:58:38
>>443
わざわざ型タグを含めたObject型を持ち出しているから、実装に忠実な
データ構造を提示しているつもりかと思った。

>頭の中のモデルとしてはこれで十分。
遅延を考慮しないなら十分だろうが、そういう単純化した
モデルとしてなら無駄が多くないか?

struct node
{
  void *head;
  struct node *tail;
};

で十分だと思うが。
445デフォルトの名無しさん:2007/01/05(金) 17:18:17
>>444
文字列とかの "本物のデータ" が
どう収まるか説明しないと、
普通はイメージが湧かない思う。
まぁ、その判断は >>434 に任せるが・・・
446デフォルトの名無しさん:2007/01/05(金) 17:28:41
どう考えても 444 ので十分
447デフォルトの名無しさん:2007/01/05(金) 17:47:17
同意 十分
448デフォルトの名無しさん:2007/01/06(土) 14:36:31
検索が定数時間な連想配列を探していて、GHCのData.HashTableに辿り着いた。
でも何でこれってあちこちIO付きなの?
449デフォルトの名無しさん:2007/01/06(土) 18:59:17
>>448
なぜData.Mapみたいなインタフェースじゃないか、という疑問なら、効率の問題。
Data.Mapのようなインタフェースだと、配列に操作(たとえばinsert)を施した後、
操作前の配列と操作後の配列の両方を操作しえるので、この二つを別々に
保持しておかないといけない。(ナイーブには毎回コピーをとればよい。
もっと低コストな方法もあるだろうが、いずれにせよオーバーヘッドがある)
実際Data.HashTableのようなIOの絡んだインタフェースなら、
常に最新版しか操作できないので、単純なメモリ上の破壊的操作で実装できる。

なぜSTじゃなくてIOなのかという疑問なら、俺にも判らん。
450448:2007/01/06(土) 23:35:56
>>449
ども。Haskell初学者なので処理系の中の人の気持ちはあまりわからんけど、
破壊的操作を用いて実装すれば実行時効率がよいことは理解できる。ありがとう。

STってのはControl.Monad.STのこと?
GHC付属文書での記述を軽く眺めてみたけど、さぱーりだった…

で、便乗して別の質問。Data.Map的なインタフェースを持つ型について。
その型の変数xがあって、内容を一部変更した値を変数yに格納して、
変数xの内容を完全に破棄したとき、「いつでも全体をコピーしたりはしない」
ことはわりと期待してもよいもの?
451デフォルトの名無しさん: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から質問です。)
452デフォルトの名無しさん:2007/01/07(日) 11:38:11
下位の関数の出力がIOだと上位の関数の出力がIO汚染されてしまうんですけど、
なんとか良いプログラミングスタイルないですか?
453デフォルトの名無しさん:2007/01/07(日) 11:39:43
IOつかわなければいいとおもうよ
454デフォルトの名無しさん:2007/01/07(日) 11:39:54
>>451
中身では、
type String = [Char]
ということになってるのかな。
だから、Stringも[Char]も同じ。
455デフォルトの名無しさん:2007/01/07(日) 11:45:58
下位の関数でIOを返した場合、連鎖的に上位のすべての関数の返値にIOをつけなければならなくなると思うのですが、
そういう場合って、SICPで勧めているプログラミングスタイルだと二度手間になってしまいますよね。
456デフォルトの名無しさん:2007/01/07(日) 11:58:00
中でやってることが外部に副作用を残さないような処理なら
unsafePerformIOでIOを外しちゃえばいい。
457デフォルトの名無しさん:2007/01/07(日) 12:23:20
>>455
最初から上位の関数にIOをつけておけば良い。
458デフォルトの名無しさん:2007/01/07(日) 13:03:05
>>456
たとえば、設定ファイルの読み込みとかの用途だとそれでも良いかもしれないが、
unsafePerformIOだと実行順序が規定されなくなってしまうでしょ?

>>457
すべての関数にIOをつけると、ものすごく再利用しにくくて汚いコードになると思うのですが・・
459デフォルトの名無しさん:2007/01/07(日) 13:12:29
>>458
全体として実行順序が規定されていなきゃいけない処理なら
IOが必要な部分だからそのままでいいのでは。
460デフォルトの名無しさん:2007/01/07(日) 13:53:54
>すべての関数にIOをつけると、ものすごく再利用しにくくて汚いコードになると思うのですが・・
ライブラリの関数や、部品としての再利用を目的とした関数なら、
将来にわたって入出力をしないと確信を持って言えることがおおいだろうから、
そういう場合にはIOなしで問題ない。
逆に、部品としての再利用性よりも変更に強いことが求められる部分
(アプリケーションのなかで比較的上位の(mainに近い)部分とか)は、たとえ現時点で入出力が
絡まないとしても、IOをつけておいて損はないと思う。
461デフォルトの名無しさん:2007/01/07(日) 14:07:09
>>450
>STってのはControl.Monad.STのこと?
そう。IOと同様にメモリ操作のできるモナドだけど、
IOと違って入出力には使えず、その代わりrunSTを使って外せる。

>ことはわりと期待してもよいもの?
なんともいえない。
たとえばtailはコピーを一切しないで実装されてる
(結果のリストと元のリストは完全に共有される)し、
Data.Map.insertの結果も大部分を元のmapと共有する。
一方で、initはリスト全体をコピーするし、Data.Array.Array
ではすべての変更操作ごとに配列全体がコピーされる。
(効率のために、なるべくたくさんの操作を一回にまとめて適用できるようになっているけど)
462デフォルトの名無しさん:2007/01/07(日) 14:42:41
納得いかないな・・・
モナドより使いやすいものは無いものだろうか。
463デフォルトの名無しさん:2007/01/07(日) 16:04:08
IOというか、(Monad m) => m aみたいな型を付けておけばOK。
464デフォルトの名無しさん:2007/01/08(月) 01:14:53
Data.Map の実装はAVL木なので、 insert のタイミングでは rotation が発生しうるけど、たいていの場合はそれほどコピーが発生しない。 Data.IntMap はパトリシア木であまりコピーは発生しない。
Data.Array は書き換えのたびに全体をコピーしている。ただし MArray を使えばモナド操作で一部の書き換えが可能。
リストの init はコピーを発生するが、 ByteString の init は定数時間でコピーを発生させない。
Data.Sequence はそれなりの償却コストがかかる。

というようにデータ構造によってそれぞれ違うから、「ドキュメントを読みなさい」というのが正解。



下位の関数の出力がIOでも、それに fmap で純関数を適用すればいいのでは。
綺麗に書きたいなら Control.Applicative が使えるかもしれない。
465デフォルトの名無しさん:2007/01/08(月) 16:36:54
プログラムのプロファイルを取りたいんだが、可能?
可能なら、どうやったらよい?

知りたいのは、実行したプログラムのどこにどの程度の処理時間がかかっているか、
各関数は何回評価されたか、ってあたり。トータルじゃなくて内訳を見たい。
466デフォルトの名無しさん:2007/01/08(月) 17:19:06
>>465
GHCを使ってるなら、-prof -auto-all付きでコンパイルして、
できた実行ファイルを+RTS -p付きで実行すると、
<実行ファイル名>.profというファイルにプロファイル結果が出力される。
詳しくはGHCのユーザガイドを読んでくれ。
467デフォルトの名無しさん:2007/01/08(月) 17:26:45
>>465

例:
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
468デフォルトの名無しさん:2007/01/08(月) 22:34:49
>>466,467
thx。

ユーザガイドのまるまる1章がProfilingなのね。
ざっと眺めただけだけど、heap profilingなんかは使い込むと便利そうだ。

まずは書いてもらった基本操作から使ってみるよ。
469デフォルトの名無しさん:2007/01/10(水) 11:02:23
質問です。
Haskellでは空リストがリストの終わりを表すと聞きました。
では、map関数を使って空リストに関数を適用させることは出来ないのでしょうか?
470デフォルトの名無しさん:2007/01/10(水) 11:11:25
ふつうのHaskell読んでるけどさっぱりわからん。
実際に組みながら覚えるのが良いんだろうけど・・・

自分としては最終的にはモナディウスみたいなゲームを作ってみたいのですが
グラフィックを扱うプログラムって、初心者には敷居が高いんですかね?

初心者がHaskellを覚える為に組むとしたら、どんなものがオススメですか?
抽象的ですみませんが、皆さんがどんなプログラム組んで覚えたかでもよいので教えてください。
471デフォルトの名無しさん:2007/01/10(水) 11:23:59
>>469
空リストがリストの終わりを表すのではなくて、空がリストの終わりです。
プログラミング的には空リストをリストの終わりとして処理しています。
空に関数を適用できません。

>>470
グラフィックスを扱うのはIO周りの事がよく理解できていれば可能だと思います。
472デフォルトの名無しさん:2007/01/10(水) 11:25:50
残念ながら日本語で書かれたよい文献はありませんのが、英語で書かれた読みやすい論文ならいくつかあります。
473デフォルトの名無しさん:2007/01/10(水) 11:28:37
↑の方のレスにいくつか論文が上げられていますね。
474デフォルトの名無しさん:2007/01/10(水) 11:28:40
各種UNIXコマンドとかがおすすめ。
ゲームプログラミングには Haskell は向いてないと思う。


>469
それくらいやってみりゃいいだろ。なんでいちいち聞くの。
Prelude> map id []
[]
というかなんで出来ないと思うのかがわからん。
475デフォルトの名無しさん:2007/01/10(水) 11:32:07
>>471
>空に関数を適用できません。
これはひどい。
476デフォルトの名無しさん:2007/01/10(水) 11:33:32
>>475
だったら空リストじゃなくて空に関数適用するようなHaskellコード書いてミロや!!!!
477デフォルトの名無しさん:2007/01/10(水) 11:47:52
>>476
あんたの空と空リストの定義がおかしいだけ
空リストは空そのものとして定義される。これは仕様書にもある。
478デフォルトの名無しさん:2007/01/10(水) 12:53:52
>>471,474
回答有難うございます。
結局空のリストに関数適用はできるという理解でよいのでしょうか?
Prelude> map id []
[]
このidという関数はどういう定義なのでしょうか?
また、
Hugs> map id [[],[],[]]
[[],[],[]]
という事も出来たのですが、この場合map関数は
「空リストのリスト」の最後に空リストがもう一こ上のレベル?で有るから
「空のリストのリスト」は終わりと判断して再帰を終わらせるという理解で良いでしょうか?
479デフォルトの名無しさん:2007/01/10(水) 13:37:57
>>476
まぁいいから外にでて空を見上げてみろ、今日は良い天気だ、「のどか」って書いてないか?
480デフォルトの名無しさん:2007/01/10(水) 14:09:22
空(カラ)なのか空(そら)なのか空(=NULL)なのか?定義してくれ。Haskell的に
481デフォルトの名無しさん:2007/01/10(水) 14:34:16
「外にでてから」だけでは推論に足りないって事か。
「屋外にでて上を見上げて」なら推論可能?
482デフォルトの名無しさん:2007/01/10(水) 15:33:24
>>478
idと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 [] ) )
=> [] : ( [] : ( [] : [] ))
=> [] : ( [] : [[]] )
=> [] : [[], []]
=> [[], [], []]
のように計算される。
483デフォルトの名無しさん:2007/01/10(水) 16:34:21
>>477
そんな記述はどこにもない。
あるというならどの文献のどのページにあるのか言ってみろ。
484デフォルトの名無しさん:2007/01/10(水) 16:42:38
個人情報じゃないけど何かあったみたい。
485デフォルトの名無しさん:2007/01/10(水) 17:49:05
>>482
すみません、

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 [[], [], []]

を実行するとあまりうれしくない結果が出てきます。
どうしてですか?[]は何型なのでしょう・・・
486デフォルトの名無しさん:2007/01/10(水) 17:51:37
[1,2,3]の最後に入っている(という主張の)[]はInt型ですか?
487デフォルトの名無しさん:2007/01/10(水) 17:55:36
>>431
> square n が n * n と等値。
ええ?!じゃあ、たとえば、

test :: Int -> Int
x * x = test x

ってコンパイル通るんですか?!
488デフォルトの名無しさん:2007/01/10(水) 19:57:43
>>485
>どうしてですか?[]は何型なのでしょう・・・

結局の所、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]
489デフォルトの名無しさん:2007/01/10(水) 20:06:26
>>488

mapsucc :: [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 `[[], [], []]'

と表示されました。
おかしいですよね、これって。
490デフォルトの名無しさん:2007/01/10(水) 20:08:47
[a]って何ですか?空リストは空じゃなかったんですか?!!!!
491デフォルトの名無しさん:2007/01/10(水) 20:11:37
mapsucc :: [Int] -> [Int] なんだから mapsucc [[], [], []] の [[], [], []]は[Int]型だと思って評価しようとするんだけど、
[[], [], []] :: [Int] であるためには [] :: Int でないといけない。
だけど[]は[a]であってIntではない。よって型の不一致(Couldn't match `Int' against `[a]')
492デフォルトの名無しさん:2007/01/10(水) 20:22:32
>>491
空の型は総称的定義されているべきだと思うんですけど。
上のコードでは
mapsucc :: [Int] -> [Int]
のように明示的に書いたので、Int型にインスタンシエイトされるべきですよね?
493デフォルトの名無しさん:2007/01/10(水) 20:35:27
>>492
> 明示的に書いたので、Int型にインスタンシエイトされるべきですよね?
その理屈でいくと、[] + 1 :: Intとか1 + [] :: Int って書いたら
なんか適当なInt型の値が得られなきゃいけないって事?
494デフォルトの名無しさん:2007/01/10(水) 20:40:39
>>493
1+[]なんて定義できないよね。そう思うよね?
だから、空は抽象的なものであって、Haskellの仕様では、空リストと空は別ものなのです。
495デフォルトの名無しさん:2007/01/10(水) 20:58:04
そもそも >>469 に"Haskellでは空リストがリストの終わりを表す"と言ったヤツが勘違いしていると思う。

おそらく
[1,2,3] = 1 : [2, 3] = 1 : ( 2 : [3] ) = 1 : ( 2 : ( 3 : [] ) )
と分解できるから[]が終端なんだと言ったんだろうけど、
これは単に空リスト[]の先頭に3, 2, 1を順に追加していったものがリスト[1,2,3]だってこと。
もしくは、(有限)リストから先頭を取り除く操作をしていった場合、空リスト[]に行き着いた時点でそれ以上先頭を取り除くことが出来なくなるってこと。
496デフォルトの名無しさん:2007/01/10(水) 21:22:15
一応終端記号的なものとして空リスト[]があるからリストの終わりを表すというのは間違いでもないか。

ただ、リストの要素として[]がリスト[1,2,3]の終わりに入っていると考えるのは間違い。
497デフォルトの名無しさん:2007/01/10(水) 21:31:43
ふと思ったんだけど、量子コンピュータができれば、リストだけじゃなくて、本当の集合を扱えるようになるのかな・・・
498デフォルトの名無しさん:2007/01/10(水) 22:44:01
非決定性TMも実現できるんじゃね?
499デフォルトの名無しさん:2007/01/10(水) 22:55:26
>>497
本当の集合って何?
500469:2007/01/10(水) 22:57:09
皆さん、自分が変な質問したばっかりに申し訳ないです。
>>495
すいません。「Haskellでは空リストがリストの終わりを表す」とは書いてないです。
やさしいHaskellのp36に
「空リストは特別な値で、リストの末尾に現れます」とあります。
で、自分が「C言語の文字列でいうところのヌル文字みたいなものだ」と
勝手に解釈したんです。
で、
「map関数で何かのリストに適当な関数を適用するとき、
リストの終端を判定するとき空リストがあれば、
再帰を打ち切る」んだなと思ったんです。
もし曲解している点があれば、指摘してください。
501デフォルトの名無しさん:2007/01/10(水) 23:14:43
>>500
Haskellのリストは単方向リスト。
Cの文字列みたいに何らかのターミネータを持つ配列じゃない。

struct LIST{void*value;struct LIST*next;};
Cで言うと(struct LIST*)NULLが空リスト。
要するにHaskellはnextの値が空リストかどうかで終端を判断している。
君はvalueが特殊な値('\0')のときに終端になるのだと勘違いしている。

と、説明書いてみたけど、うーん自分でもこれじゃあ分かりくいな。どうかけばいいだろう。
502デフォルトの名無しさん:2007/01/10(水) 23:34:08
Cで書くなら

enum Tag { NIL, CONS };
struct Nil { Tag t; };
struct Cons { Tag t; void *head; union List *tail; };
union List { struct Nil nil; struct Cons cons; };

という感じでないか
503デフォルトの名無しさん:2007/01/11(木) 03:18:20
Haskellのリストはモナドなので、Cで説明するのは骨が折れると思うから、モナドで説明した方が良いと思う。
504デフォルトの名無しさん:2007/01/11(木) 06:47:50
リストというのは、
Cons → 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 [] の結果は [] となります。
505デフォルトの名無しさん:2007/01/11(木) 21:57:46
ふつうのHaskellと入門Haskell読み終わったくらいなんだけど、
SICPって読んだほうがいい?
506デフォルトの名無しさん:2007/01/11(木) 22:08:52
>>505
目的による。
何がしたいの?
507デフォルトの名無しさん:2007/01/11(木) 22:36:40
>506
最近寝付きが悪いので…
508デフォルトの名無しさん:2007/01/11(木) 22:39:11
>>507
読むことを激しく勧める
509デフォルトの名無しさん:2007/01/11(木) 22:47:17
サンクス。さっそく注文する。

この手の専門書は、原書より訳本の方がいいよね?
へんてこな翻訳文体が心地よい眠りに誘うと期待
510デフォルトの名無しさん:2007/01/11(木) 22:52:09
訳がむごいという人もいるが
よほどスラスラ英語を読めるのでもなければ
そんな訳でも訳の方がマシだと思う。
少なくともSICP程度の訳であれば。
511デフォルトの名無しさん:2007/01/11(木) 22:54:46
>>509
へんてこなのには違いないんだけど、なんか勝手に訳語作っちゃったり、痛さあふれる訳本です。
512デフォルトの名無しさん:2007/01/11(木) 23:11:24
訳語って翻訳者が勝手に作るものだと思ってた。
513デフォルトの名無しさん:2007/01/11(木) 23:20:11
>>512
偉い人が作って、みんながそれが正しいと思って使うようになるんだけど、
誰もその人の訳語を使わないし、そもそも新しい訳語を作れるほど自分は偉いんだ、
と思いこんでる身の程知らずのタコだから痛いんですよ。
514デフォルトの名無しさん:2007/01/12(金) 20:49:23
おまいら静かだけど、もしかして二チャンネル閉鎖騒ぎに参加してるですか?
515デフォルトの名無しさん:2007/01/12(金) 21:14:22
そんなくだらないことに参加はしないのです。
ただ議論がしたいからここを利用しているだけで、
なくなれば別のところにいくだけです。
516デフォルトの名無しさん:2007/01/12(金) 21:24:32
2chが閉鎖したときのためにHaskellについて議論できるような所ってどこがあるのかな
517デフォルトの名無しさん:2007/01/12(金) 21:35:57
http://www.sampou.org/cgi-bin/haskell.cgi?MailingList
で良いんじゃねぇ?
もしくはHaskellで適当な掲示板作るとか。
出来ないかな。
俺は2ch潰れて欲しいな。
人文科学の観点から、これほど大きい掲示板が潰れると
どういう影響が出るか見てみたい。
まるで夕張が国の実験場になるように。
518デフォルトの名無しさん:2007/01/12(金) 21:57:27
2chほど便利なコミュニティ+情報収集サイトは消えちゃマジで困る
個人的な立場で言うと、まじめにGoogle無くなるよりも困る
519デフォルトの名無しさん:2007/01/12(金) 22:11:42
俺としてはわりとどうでもいい。
ただ、専ブラの発明は偉大であると思ったので、
この方式自体は生き残るだろう。

ブログってRSSフィードを出力するのが増えてるけど、
専ブラで読める形式を出力するのってどうね?
とブログスレで提案したんだが、だれも作ろうとしない。

ああ、スレ違い
520デフォルトの名無しさん:2007/01/12(金) 22:27:13
専用ブラウザってのは2chのダメダメすぎる所を補うために出て来たもんであって、
無くて済むのならない方が良い。絶対に良い。
521デフォルトの名無しさん:2007/01/12(金) 22:36:48
そうかな
2chを毎日見る人間ってけっこう多いと思うぞ

インターネットと2chが1:1になるくらい
となるとブラウザと2chブラウザはわけて存在したほうがスッキリする
522デフォルトの名無しさん:2007/01/13(土) 03:20:14
ぐわぁ、どうも
文字
文字列
文字のリスト
文字列のリスト
の実感がイマイチわからねぇ。
関数の引数の型によって、文字のリストが文字列になったりその逆になったり
う〜ん。
あと、質問なんですけれども
多相型と型変数ってどこがちがうのでしょうか?
523デフォルトの名無しさん:2007/01/13(土) 03:32:11
>>521
オマエ、マチガエテル。
2ch ハ、インターネット ニ フクマレルカラ ソレジャ 2ch シカ リヨウシテイナイコトニナルネ。
2ch ブラウザ ガ アレバ ブラウザ イラナイネ。
524デフォルトの名無しさん:2007/01/13(土) 04:21:07
集約の関係なんてどうでもいいんだよハゲ
525デフォルトの名無しさん:2007/01/13(土) 04:57:05
>>522
C言語はchar配列が,いわゆる「文字列」じゃん
Haskellは [Char] が「文字列」

あと多相型を表現する(書き表す?)ために使われるのが型変数でそ
526デフォルトの名無しさん:2007/01/13(土) 05:23:40
じゃんじゃんでそでそ
527デフォルトの名無しさん:2007/01/13(土) 07:04:55
>>523
きっとインターネット以外のネットワークを使って2chにアクセスしてるんだよ。
528デフォルトの名無しさん:2007/01/13(土) 10:21:05
navi2chが使えて人がいればよくね?
529デフォルトの名無しさん:2007/01/13(土) 11:26:21
>>522
文字 Char
文字列 [Char]
文字のリスト [Char]
文字列のリスト [[Char]]
530デフォルトの名無しさん:2007/01/13(土) 11:27:01
type String = [Char]
531デフォルトの名無しさん:2007/01/13(土) 13:17:02
赤い彗星はシャア!
532デフォルトの名無しさん:2007/01/13(土) 14:05:00
     ll     ll
     l| -‐‐- |l
    ,イ」_  |ヽ_| l、
   /└-.二| ヽ,ゝl
   l   ,.-ー\/. 、l
  |  /.__';_..ン、    ビ〜ィ〜ム かがーやーく♪
  / /<二>  <二>!゙、
 //--─'( _●_)`ーミヘ    フラッシュバックに〜ぃ♪
<-''彡、   |∪|  、` ̄ ̄ヽ
 / __  ヽノ   Y ̄)  |
 (___)       Y_ノ
      \      |
       |  /\ \
       | /    )  )
       ∪    (  \
             \_)
         ll     ll
         l| -‐‐- |l
        ,イ」_  |ヽ_| l、
       /└-.二| ヽ,ゝl
       l   ,.-ー\/. 、l
      |  /.__';_..ン、  ヤツのかげーー♪
      / /<二>  <二>!゙、
     //--─'( _●_)`ーミヘ
    <-''彡、   |∪|  ミ __>
   (  (/     ヽノ_  |
    ヽ/     (___ノ
     |      /
   / /\  |
   (  (    ヽ |
  /  )    ∪
  (_/
533デフォルトの名無しさん: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 |   |
  |  /.__';_..ン、!   ! |  /.__';_..ン、!   !|  /.__';_..ン、!   !
  / /<二>  <二>!゙、 // /<二>  <二>!゙、 // /<二>  <二>!゙、 /
 //--─'( _●_)`ーミ /.//--─'( _●_)`ーミ / //--─'( _●_)`ーミ /
<-''彡、   |∪|  / <-''彡、   |∪|  /  <-''彡、   |∪|  /
 / __  ヽノ /     / __  ヽノ /    / __  ヽノ /
 (___)   /     (___)   /     (___)   /
534デフォルトの名無しさん:2007/01/15(月) 22:00:10
ここが噂の関数型言語スレか
535デフォルトの名無しさん:2007/01/15(月) 22:04:01
>>534
関数型言語の総合スレはこちらです↓

関数型言語Part IV
http://pc10.2ch.net/test/read.cgi/tech/1083649982/
536デフォルトの名無しさん:2007/01/19(金) 01:52:30

廃れてんなぁ
なんかHaskelニュースとかねーのか
537デフォルトの名無しさん:2007/01/19(金) 09:31:31
538デフォルトの名無しさん:2007/01/20(土) 19:04:51
語ろう是!
539デフォルトの名無しさん:2007/01/20(土) 21:06:22
任せ炉!
540デフォルトの名無しさん: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文を実装した点に意味があるって事?
541デフォルトの名無しさん:2007/01/21(日) 08:53:33
>>540
int myif(int a, int b, int c) {
 return a ? b : c;
}
int main() {
 myif(1, printf("true"), printf("false"));
}
542デフォルトの名無しさん:2007/01/21(日) 09:38:09
>>541
うん、それもわかるよ。
でもそれだって結局ifの言い換えでしょう?
俺が聞きたいのは
main = do myif (True) (putStrLn "then") (putStrLn "else")
でthenが実行されるのは当然で、何がすごいのか分からないんだ。
これと遅延評価の何が関係有るの?
教えて、偉い人。
543デフォルトの名無しさん:2007/01/21(日) 10:02:42
>>540
Cには「中身が実行されないことがある構文」(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の例を使わない方が良いと思う。
544デフォルトの名無しさん:2007/01/21(日) 11:09:27
理解もできず、実際にコードのコンパイル・実行をしない奴に説明しても。
545デフォルトの名無しさん:2007/01/21(日) 15:55:04
546デフォルトの名無しさん:2007/01/21(日) 17:08:29
>>545
ゴルァ!
547デフォルトの名無しさん:2007/01/22(月) 00:20:55
[ n | (n,True) <- zip [1,2,3,4,5] [True,False,True,False,False] ]
他のletの中とかならマッチしない時点でエラーが出ると思うのですが
なぜこのやりかたで絞込みができるのでしょうか?
内包表記が特別扱いされてるとか?
548デフォルトの名無しさん:2007/01/22(月) 00:31:11
>>547
リストはMonadPlusで、内包表記はdo記法の略記。
doの中でマッチングが失敗するとモナドのfailが呼ばれ、リストのfailはmzeroを返すから
その後に続く式が無効化される。
549548:2007/01/22(月) 02:06:48
>>548
Prelude> 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
なるほど。特別扱いではあるけどユーザも使えるわけですね。
550デフォルトの名無しさん:2007/01/22(月) 19:51:17
do記法ってsyntax sugerじゃなかったのね
551デフォルトの名無しさん:2007/01/22(月) 20:06:18
do P <- E ; REST...

E >>= \x -> case x of
  P -> do REST...
  _ -> fail "message"
の構文糖
552デフォルトの名無しさん:2007/01/22(月) 23:45:48
>>551
> doの中でマッチングが失敗するとモナドのfailが呼ばれ
というところが構文糖だけじゃないんじゃない?ということだと思う。
553デフォルトの名無しさん:2007/01/22(月) 23:47:25
すまん、書いてから551をじっくり読んだ orz
554デフォルトの名無しさん:2007/01/23(火) 02:07:43
Haskell98はdo経由せずにそのまま変換するようになってるな
[ 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])
意味はほぼ一緒だが
555デフォルトの名無しさん:2007/01/23(火) 02:27:29
>>554
Haskell98ではなくて、GHCではそうだね。
556デフォルトの名無しさん:2007/01/23(火) 15:17:18
update :: Assoc a b -> a -> b -> Assoc a b
update 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 に対応しているのでしょうか?

よろしくお願いします。
557デフォルトの名無しさん:2007/01/23(火) 16:08:51
>>556
type 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
558デフォルトの名無しさん:2007/01/23(火) 19:05:54
>>557
返信ありがとうございます。

>これは、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 に相当するパラメータの指定が、
関数定義に存在していないのが理解できません。

これは何か特殊な仕掛けがあるのでしょうか?
559デフォルトの名無しさん:2007/01/23(火) 19:07:50
>>558
ずれてる。>>557をもう一度見返して。
560デフォルトの名無しさん:2007/01/23(火) 19:35:24
>>558
もっと単純な例を挙げる。

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」みたいなのは型シグネチャといって、
ふつう定義とはいわないと思う。
561デフォルトの名無しさん:2007/01/23(火) 19:54:15
Haskellの標準GUIライブラリはどこにありますか?
562デフォルトの名無しさん:2007/01/23(火) 20:58:58
どこにも。
563デフォルトの名無しさん:2007/01/23(火) 21:09:00
どこにでも。
564デフォルトの名無しさん:2007/01/23(火) 22:01:08
>>559
>>560
返信ありがとうございます。

理解するに至りました。
どうもありがとうございます。
565デフォルトの名無しさん:2007/01/24(水) 01:49:28
圏論コミュがありえない展開
566デフォルトの名無しさん:2007/01/24(水) 07:48:46
どこどこ
567デフォルトの名無しさん:2007/01/24(水) 18:11:51
どこにも。
568デフォルトの名無しさん:2007/01/24(水) 20:47:37
どこにでも。
569デフォルトの名無しさん:2007/01/27(土) 22:31:06
ソケットプログラミング(TCPもUDPも、IPv6も(!))したいんだが、
何を使うのがお勧め? GHCの付属モジュールにはないようなのだが。

とりあえず、socatという、STDIOをソケットにつなげるツールを
使ってwrapしてみようかとは思っているのだが。

そもそもHaskellでのネットワークプログラミングが、IOと同じ
要領でいいのかどうかも知らないけど。
570デフォルトの名無しさん:2007/01/27(土) 22:58:46
どれでも
571デフォルトの名無しさん:2007/01/27(土) 23:10:12
>>569
>GHCの付属モジュールにはないようなのだが。
Network.Socketじゃだめなのか?
572デフォルトの名無しさん:2007/01/27(土) 23:18:27
>571

な!

http://haskell.org/onlinereport/

が全てだと勘違いしてたよ。どうもありがと。
573デフォルトの名無しさん:2007/01/27(土) 23:18:40
GUIプログラミング(Windows上で)したいんだが、
何を使うのがお勧め? GHCの付属モジュールにはないようなのだが。
574デフォルトの名無しさん:2007/01/27(土) 23:27:34
Windowsだと一応Graphics.UI.ObjectIOがある。
でも資料がほとんどないねぇ。

GHC用のGUIライブラリってwxHaskell, gtk2hsとかほかにも幾つかあるけど、
2006年中に新バージョンがリリースされたものって1つもないよね。
575デフォルトの名無しさん:2007/01/28(日) 00:03:34
色んな人がライブラリを作ってたけど、どれも長続きしないね…
576デフォルトの名無しさん:2007/01/28(日) 00:31:28
サンプル見つけた よくできてる
http://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
577デフォルトの名無しさん:2007/01/29(月) 18:44:30
ObjectIOは一度頓挫したのが引き継がれて、GHC-5.02の時期の更新を最後に
開発が止まってるね。
「GTKへの移植は次期リリースで」っていうのを見て期待してたんだけど。
578デフォルトの名無しさん:2007/01/29(月) 19:12:04
しかもVS2005を入れてもいいかなーって状況になりつつあって
気づいたらVisual Haskell 0.2が出てるんですが、
依然としてVisual Haskellさんは問題ありありな感じだったりします?
579デフォルトの名無しさん:2007/01/29(月) 19:30:04
>>578
もちろん、問題ありです。
現状では、Windowsでのプログラミング環境は、meadow + haskell-mode + GHCが一番使いやすいですね。
580デフォルトの名無しさん:2007/01/29(月) 19:49:30
あーやっぱそうですか
問題のありそな処理系使うほどもっさりIDE好きでもないのでスルーしておきますわ

アリガトウ アリガトウ
581デフォルトの名無しさん:2007/01/29(月) 20:08:20
>>580
IDE好きでないとのことですが、
IDEならEclipseもHaskellをサポートしているようですよ。
582デフォルトの名無しさん:2007/01/29(月) 20:25:26
情報ありがと
Eclipseも使う機会無くはないんですが冷静に考えると
haskellで大きいもの書くことがほぼ無いのでテキストエディタとghcで十分な感じです
583デフォルトの名無しさん:2007/01/29(月) 20:31:52
>>581

ttp://061196246067.cidr.odn.ne.jp/soutaro/20041004
> eclipseの標準入力がおかしいとか,実行ファイル名を指定できないとか,
> コンパイルオプションを指定できないとか,むきーってなる.

誰か、むきーってなった人いませんか?
584デフォルトの名無しさん:2007/01/29(月) 20:51:18
>>583
確かに、eclipseのhaskellプラグインも不完全だと思いました。
たとえば、内部でghciを起動したあと、そのプロセスを殺さずに、新たに内部でghciを起動すると、
前のghciのプロセスがそのまま残ってしまう、とか^^;
585デフォルトの名無しさん:2007/01/29(月) 20:54:08
あと、xyzzyのhs-modeも試してみましたが、
自動インデント機能がおかしくなる場合があるのを見つけたので、
結局、haskell-modeに落ち着いたわけです。
586デフォルトの名無しさん:2007/01/29(月) 21:01:37
>>584-585
情報アリガトウ
587デフォルトの名無しさん:2007/01/29(月) 21:26:42
漢は黙ってメモ帳+コマンドプロンプト
588デフォルトの名無しさん:2007/01/30(火) 05:53:45
hasktagって関数をちゃんと認識してくれないときがあるよね
589デフォルトの名無しさん:2007/01/30(火) 21:56:40
EclipseFPでHaskellのソースを
自動整形するのってどうやるの?

できなかったっけ?
590デフォルトの名無しさん:2007/01/30(火) 23:38:11
hasktagsのコードを見れば分かるが、
すんごい単純なコードだったよ。
ちょっと前の話なのであれだけど。
591デフォルトの名無しさん:2007/01/31(水) 15:15:10
さいきんC++でHaskellicなプログラムを書こうとして
名前の長さと括弧の多さにorzとなってる。
592デフォルトの名無しさん:2007/01/31(水) 15:42:09
>>591
C++ではどうがんばってもHaskellっぽく書くのは無理だと思う。
遅延評価ができないから。
593デフォルトの名無しさん:2007/01/31(水) 16:41:05
>>592
遅延評価ができなくとも、HaskellのリストをC++のイテレータだと思えば
リスト周りくらいはイテレータ間の変換として作れそうと思ったのです。
-- なんだかboostにありそうな気もするけど
594デフォルトの名無しさん:2007/01/31(水) 18:56:43
boost::iterator_adaptorsってやつ?
595デフォルトの名無しさん:2007/01/31(水) 19:23:54
http://d.hatena.ne.jp/Cryolite/20061211#p1
こういうのだろうか。

C++は驚くほどなんでもできるけど、何かしようとするといちいち手間が掛かるし、
細かい言語上の制約がうざったいので、遊び道具にするのも一苦労だ。
596デフォルトの名無しさん:2007/01/31(水) 20:08:27
smp版のghc(6.6)使ってる人いる?
core2duoの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を指定してるんだが…
597デフォルトの名無しさん:2007/02/01(木) 00:33:30
TemplateHaskellでコメントって扱えないのかな?
{-# NOINLINE hoge #-} を一杯生成したいんだが
598596:2007/02/01(木) 19:57:45
誰かいませんかー?
599デフォルトの名無しさん:2007/02/01(木) 20:06:54
>>596
キャッシュ汚染のせいだと思う・・・
600デフォルトの名無しさん:2007/02/01(木) 20:25:58
>>599
どうもです。
一応summing(0からnまでの和を求める関数)も引数をeagerに評価させて
ほとんどメモリを消費しないようにしてるんだけど…

summing 0 a = a
summing n a | n > 0 && a >= 0 = summing (n-1) (a+n)

これでもキャッシュ汚染は起こりますか?
601デフォルトの名無しさん:2007/02/01(木) 23:03:28
高尚な話題の最中に素人っぽい話で割り込んでごめん。
HaskellのライブラリAPIって、ライブラリのソースから自動生成された
(あまり整理されているとは言えない)ドキュメントしかないの?
Network.Socket の使い方が全くわからず数日間悩んでいるのですが‥‥‥。

例えば receipe 集みたいなサイトご存知でしたら教えてください。
本は「ふつうの〜」しか持ってませんが、網羅的な本があったら
がんばって買ってもいいかも。
602デフォルトの名無しさん:2007/02/01(木) 23:07:53
「入門Haskell」ならある程度リファレンスになるけど、Networkは無いなあ…
603デフォルトの名無しさん:2007/02/01(木) 23:11:00
>>601
論文ぐらいしかないよ。
604デフォルトの名無しさん:2007/02/01(木) 23:30:55
>>601
それしかない。
Network.Socketについていうと、リファレンスにも書いてあるが、
インタフェースはCのAPIそのままだから、そっちを調べるべき。
関数に説明が付いていないのもこれが理由。
605デフォルトの名無しさん:2007/02/01(木) 23:33:18
キャッシュ汚染ってなーに?
606P2Pソフトを妄想中:2007/02/02(金) 00:24:58
>602-604

ありがとう。Cのsocket APIは理解しているつもりなので、想像はできたの
ですが、なんかHaskellicな書き方に慣れないせいか、もうちょっと手引きの
ようなものがあると楽なんですけどね。

なんとかがんばってみます。対向はとりあえずpythonあたりで作って
テスト環境を作ってみないと‥‥‥
607デフォルトの名無しさん:2007/02/02(金) 17:51:57
haskellよくわからないけど
あの不親切なドキュメントみながら書いてみた

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
608デフォルトの名無しさん:2007/02/02(金) 21:19:00
Network.Socket を利用する理由は?
ふつうにネットワークのクライアントプログラムを書くだけなら、 Network で充分じゃないかな。
それでは無理な細かいところを調整するために Network.Socket はある。

逆に言うと、そういう細かいところの欲求ってのはCレベルのAPIを叩きたいっ
てことなんだから、関数名と型名だけあれば、まあ充分なんじゃない。

使いづらいし、ちょっとわかりづらいってのは同意だが。
609デフォルトの名無しさん:2007/02/04(日) 23:36:03
Control.Monad.Stateってなくなるの?
代用品は?
610P2Pソフトを妄想中:2007/02/05(月) 09:39:47
>607

ありがとう。こっちも、
http://homepages.paradise.net.nz/warrickg/haskell/http/
っての見付けてきて勉強中です。

>608

UDP使いたいのですが、Networkでできる?
あとIPv6も(って、AF_INET6は定義されているが sockaddr_in6 に対応する
ものが無さげな罠‥‥‥)
611デフォルトの名無しさん:2007/02/05(月) 10:00:04
(´・ω・`)haskellにおけるキャッシュ汚染ってなんなのさ・・・
612デフォルトの名無しさん:2007/02/05(月) 11:52:32
>>609
詳しく。
613デフォルトの名無しさん:2007/02/05(月) 12:38:09
>611

Haskellじゃなくて、CPUのキャッシュをコンカレントなスレッドが
奪いあったのではないか、という指摘なんじゃないかと。

正直、core2duoのコアとキャッシュの関係を知らないので
そういうことがおこるかどうかは知らない。普通のSMPで、かつ
スケジューラが十分賢ければ、2つactiveなthreadが走ったら
それぞれのthreadをある程度固定化するようにスケジュールして
くれると思うんだけど。

614611:2007/02/05(月) 13:26:20
>>613
さんくす。そういう問題もあるのか・・・。勉強になりますた。
615デフォルトの名無しさん:2007/02/05(月) 19:28:07
>596,>600 のプログラムだとワーキングセットが各コアのL1に十分おさまりそうだがな。
616デフォルトの名無しさん:2007/02/05(月) 21:43:29
とすると、
実はsmp対応になってなかっただけ、ってオチがいちばんありそうだな。
617デフォルトの名無しさん:2007/02/06(火) 00:58:28
Haskellわけわかんねぇ

まだ8bitのバイト列の書き出しすらできねぇ
俺様の頭は激しく悪いな


618デフォルトの名無しさん:2007/02/06(火) 01:27:51
つ[fromEnum 'a' => 97]
つ[putStr (map toEnum [104,111,103,101])]
つ[import Bits (.&. .|. xor shiftL shiftR)]
619デフォルトの名無しさん:2007/02/06(火) 01:38:04
>618

サンクス! さんざん苦労してこんなん書いてみたが馬鹿みたいだったな(笑)
頭固くなってしまったものだ‥‥‥ 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

620デフォルトの名無しさん:2007/02/06(火) 09:42:40
キミの頭がわたしの200倍は良いことが判った

さぁVBの仕事してくるか・・・
621デフォルトの名無しさん:2007/02/07(水) 00:37:44
みんな〜 お・ま・ん・こ!

Haskell本二冊がどの本屋でも売れ残っているんだが、どっちがおしゅしゅめ?

ちなみに言語はZ80と6800のマシン語しか知らないよ。もう忘れたけど てへ 
622デフォルトの名無しさん:2007/02/07(水) 01:22:25
目を通してみて特に抵抗を感じないならふつうのHaskellの方がおまんこだと思う。
623デフォルトの名無しさん:2007/02/07(水) 01:36:35
どっちも似たり寄ったりのクズ本だけど、まだふつうのHaskellの方がマシだな。
2冊とも内容的に不十分なので、結局は生の論文を読むしかないと思う。
でも、はっきり言ってHaskellは流行らないと思うよ。
関数型言語の理論的なもとになっているラムダ計算自体が古くさい理論になりつつあるからね。
624デフォルトの名無しさん:2007/02/07(水) 01:39:06
分散計算には向いていると思うんだがなぁ。
データフローとか、今やったらいろいろと面白そうなんだが、
なにせ理論がむつかしい上に自分が手続き型にどっぷり首までつかった
人間なのと、自分の頭が悪いためたいしたことができてない。
625デフォルトの名無しさん:2007/02/07(水) 01:39:21
最近の流行りは? >623
626デフォルトの名無しさん:2007/02/07(水) 02:14:06
C系言語のみに染まっていた俺の脳みそを叩き潰してくれたのはHaskellです
Haskellはいまだに嫌いだけどたまに触ってるしこのスレも見てる
627デフォルトの名無しさん:2007/02/07(水) 02:52:45
>>623
内容が不十分というのは同意するけど、論文嫁というのは訳分からん。
Haskell 98 Reportを読めば十分だろ。
628デフォルトの名無しさん:2007/02/07(水) 03:04:45

俺Haskell使えますよ? とか言いてぇぇぇぇぇぇぇぇ
629デフォルトの名無しさん:2007/02/07(水) 08:55:10
自分ではある程度書けるけど、できる人のコードは読める(読む)気しねえ…

Haskellがはやらなくてよかった
630デフォルトの名無しさん:2007/02/07(水) 09:25:59
python使いな俺としては、perlよりは好き。
631デフォルトの名無しさん:2007/02/07(水) 09:33:27
CとRubyとPythonとPerlの違いなんて微々たるものだろ。無駄に分かれてるだけ。
632デフォルトの名無しさん:2007/02/07(水) 10:29:46
>>631
そんなことをいったらHaskellとCの違いも微々たるものじゃね?
633デフォルトの名無しさん:2007/02/07(水) 11:28:30
PythonはLisp
634デフォルトの名無しさん:2007/02/07(水) 11:55:15
>>627
Haskell98Reportだけでは不十分。
これはC++プログラマがオブジェクト指向の本を読んだりするのと似ている。
635デフォルトの名無しさん:2007/02/07(水) 12:05:23
GHCもHugsも98以降の拡張がガンガン入ってるしねえ。

しかし、λが古くさいって、計算機のパラダイムが根本から変わったなんて話は聞いた事無いんだが…
636デフォルトの名無しさん:2007/02/07(水) 12:18:09
>>635
> GHCもHugsも98以降の拡張がガンガン入ってるしねえ。
だね。最近どんどん使われはじめているアローズに付いての記述もないし。

> しかし、λが古くさいって、計算機のパラダイムが根本から変わったなんて話は聞いた事無いんだが…
たとえば、ラムダ計算だけではシームレスにアクションを定義できないし、並列性についても定義できない。
637デフォルトの名無しさん:2007/02/07(水) 15:56:19
次の仕様改訂はいつなのかな。
638デフォルトの名無しさん:2007/02/07(水) 19:47:39
>>631
Cにはクロージャが無いからそこに並べるのはちょっとキツい
639デフォルトの名無しさん:2007/02/07(水) 21:11:32
Java7で関数型が導入するっぽい動きだけど、その辺ハスケラー的にどうなの?
640デフォルトの名無しさん:2007/02/07(水) 21:14:58
Java9くらいで遅延評価と型推論が導入されたりしないかなー
641デフォルトの名無しさん:2007/02/07(水) 21:46:07
C# 3.0にはlambda式で型推論が一部入るらしい。
642デフォルトの名無しさん:2007/02/07(水) 21:59:54
643デフォルトの名無しさん:2007/02/07(水) 22:03:29
クラスベースのOOPLでlambdaってすごく取って付けみたいな感じ
644デフォルトの名無しさん:2007/02/07(水) 23:30:43
みんな〜 お・ち・ん・ぽ!

>>622-623 返事ありがとう! お礼にボクのちんぽミルクをお口にあ〜ん。

ふつうのHaskell買って見たよ!アホ用に書かれているので読みやすいにゃん

Lispみたいな言語だにゃ。x:xs は Cons CAR CDR だったのかw

忘れてたけど、漏れ昔Lispを勉強したことがあったんだ。

ただし当時ナイコン族だったので脳内Lisp処理系でしか実行したことがないのだがw

うっひょー
645デフォルトの名無しさん:2007/02/07(水) 23:44:59
ghcの中間語って、今でもSTGなんでしょうか?
646デフォルトの名無しさん:2007/02/09(金) 11:07:05
>ふつうのHaskell買って見たよ!アホ用に書かれているので読みやすいにゃん

そうなの?
647デフォルトの名無しさん:2007/02/09(金) 13:12:55
>>646
やぁ お・ま・ん・こんばんわ 昼だけどw

とりあえず8章まではふんふんと来たが代数的データ型でつまづいた。

モナドは難しいことを避けてくれたので何も説明されてないというかw

Newtype宣言したあと『時が見える』見たいな


ところで P199の

(.)関数の型宣言

(.) :: (b−>c) −> (aー>b) −> (a−>c)
凡例 f.g

の順序はこれでいいの隗?
第一引数がgで第二引数がfになるのけ?
648デフォルトの名無しさん:2007/02/09(金) 13:15:03
>>647
第一引数がf 第二引数がg
649デフォルトの名無しさん:2007/02/09(金) 15:25:25
なんかキモいスレだな。
結局日本では学生の暇つぶしにしか使われてないのかこの言語。
650デフォルトの名無しさん:2007/02/09(金) 16:36:24
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥烏鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥
鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥鳥

烏を探せ
651デフォルトの名無しさん:2007/02/09(金) 20:45:33
鳥鳥鳥
鳥鳥鳥
鳥鳥鳥
鳥鳥烏
652デフォルトの名無しさん:2007/02/10(土) 00:08:02
>>650
1秒かからず気づいた俺は天才?


ところで、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のメソッドの引数に、メソッド入れるのと何が違うのよって・・・(???)
653デフォルトの名無しさん:2007/02/10(土) 00:23:20
>>652
たとえば、こういうのはできるかな?

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
654デフォルトの名無しさん:2007/02/10(土) 01:17:28
>>652
関数を引数にするのはまあいいんだけど、
関数を返す関数も高階関数になる。
655デフォルトの名無しさん:2007/02/10(土) 01:24:01
>>654
新しいJavaの仕様でクロージャを導入したらしいけど
656デフォルトの名無しさん:2007/02/10(土) 01:28:31
657デフォルトの名無しさん:2007/02/10(土) 01:35:12
>>653
とりあえずやってみる
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はまだまだ先
クロージャについても、まだ検討段階のはずだけど
658デフォルトの名無しさん:2007/02/10(土) 02:20:33
int hoge2(function a, int b) { return a(b); }
と思えばだいたい OK。

hoge3 を計算すると次のようになる。

hoge3
= hoge2 (hoge 1) 3    (def. of hoge3)
= (hoge 1) 3        (def. of hoge2)
= 1 + 3           (def. of hoge)
= 4
659デフォルトの名無しさん:2007/02/10(土) 02:31:56
>>= (hoge 1) 3        (def. of hoge2)
ここは
= hoge (1 3)        (def. of hoge2)
のほうがわかりやすいな
660デフォルトの名無しさん:2007/02/10(土) 02:56:33
わかりやすい じゃなくて、それは間違い。

hoge (1 3) は hoge という関数に (1 3) という値を食わせることに
なるが、(1 3) という値が意味不明なので、正しく評価できない。
661デフォルトの名無しさん:2007/02/10(土) 03:28:01
>>652
public void setValue( int i ) {
これ、自分で引数にint iって書いてあるように、
実際に渡されているのは、関数じゃなくて返り値のintだお。
662デフォルトの名無しさん:2007/02/10(土) 07:40:23
>>656
これからJavaを新しく学ぼうとする奴は大変だな。
C++でもJavaでも、流行り出した頃に始めると
情報多いし似たようなことやってる人も多いし学習曲線もなだらかで
その後も放っておいても情報が入ってくるけど、
ある程度成熟してからはじめて勉強するのって大変よね。
663デフォルトの名無しさん:2007/02/10(土) 14:52:11
>>653
Haskellは興味を持ったばかりで全く読み取れないですが
こんな感じでよろしいでしょうか?

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);
}
}

スレ違いっぽくてすみません。
664デフォルトの名無しさん:2007/02/10(土) 15:41:55
>>663
違う言語だから同じかどうかはっきりとは言えないわけだけど、
意図している記法とは違うと思うよ。
最終的な出力は同じでもね。
665デフォルトの名無しさん:2007/02/10(土) 15:53:03
>>664
Aを二引数の関数、Bを一引数の関数と見ればかなり良く対応していると思うが。
666デフォルトの名無しさん:2007/02/10(土) 16:23:09
>>665
それはカリー化ではない
667デフォルトの名無しさん:2007/02/10(土) 16:34:29
>>666
何が言いたいのか分からん。
>>653は高階関数と部分適用の実演であって、Haskellでは部分適用を
カリー化を利用して行うのが一般的だからそうしているに過ぎないと思ったが。
その気になれば>>663をカリー化された形に書き換えられるだろうが、
それに何か意義があるのか?
668デフォルトの名無しさん:2007/02/10(土) 17:01:53
フレームのきっかけを作ったみたいですみません。
記法はともかく雰囲気があっているか(理解が正しいかどうか)
確かめたかっただけです。

Bのfをinterfaceにしてimplementsすればよりそれっぽかったかな。
669667:2007/02/10(土) 17:55:44
>フレームのきっかけを作った
感情的な攻撃をしたつもりはなかった。
そう見えたのなら謝る。投稿内容は無視してほしい。
670668:2007/02/10(土) 18:41:28
思い過ごしでしたか。議論の邪魔をしてすみませんでした。
書き忘れていましたが 663=668≠652 です。
あとhoge2の型も作らないといけなかったですかね。
671デフォルトの名無しさん:2007/02/10(土) 19:37:18
>>667
> その気になれば>>663をカリー化された形に書き換えられるだろうが
Haskellで書かれたコードをJavaで模倣したいのかと思ったんだが、
もしそうなら当然模倣できるところは全部模倣すべきだよ。
672デフォルトの名無しさん:2007/02/10(土) 20:53:09
まぁ >>671 の言うとおりだな
673デフォルトの名無しさん:2007/02/10(土) 21:22:01
型チェックは省略。
public 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(); }
}
674デフォルトの名無しさん:2007/02/10(土) 21:28:54
Adopting lazy evaluation strategy is left to the reader.
675デフォルトの名無しさん: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]

じゃわカリー/~
676デフォルトの名無しさん:2007/02/10(土) 23:27:56
>>675
それでできてるじゃないか。何が不満?
677デフォルトの名無しさん:2007/02/11(日) 00:10:04
>>676
converge_sin n という捨て関数を使っているし、角度の引数xはこの中で固定化されている。
それが不満。
Mapすると同時に、角度xもパラメータとして与えたい。
678デフォルトの名無しさん:2007/02/11(日) 00:16:49
main = print $ map (\n -> sin' n 1) [1..10]
main = 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

好きなのをどうぞ。
679デフォルトの名無しさん:2007/02/11(日) 00:39:28
>>678 x=1 の部分をxのままに残して、最後に与えたかった。
こんな感じか?

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
680デフォルトの名無しさん:2007/02/11(日) 23:30:38
StateとかIOとかわけわかんねぇ‥‥‥ orz
手続き型に20年安住してしまったので頭固すぎて挫折しそうですパパ。



681ちっとも理解が進まねぇorz:2007/02/11(日) 23:40:59
一定の時間ごとにkeepalive処理(通信)を行いつつサービスをするUDPな
サーバを作るときって、次のどちらが素直な設計になるますか?
ヒント頂けると有り難く。

a: State に全部の通信の状態をくるんでしまい、非同期にkeepaliveする
recvfromあるいはselectでタイムアウト付きのwaitがしたくなる、
が、探しかたが悪いのかやりかたがよくわからない‥‥‥。

b: マルチスレッドで走らせてがんばる
>596のforkIOってオイシイ?
スレッド間での状態の同期ってできるの?

c: そもそもそういう処理をHaskellでやろうと思う方が無茶

d: 俺が馬鹿なだけで、もっと簡単な方法がある
682ちっとも理解が進まねぇorz:2007/02/12(月) 00:19:26
その後軽くググって、beautiful concurrencyなる文書を見つけてみた。
まだレベル1と2の間にの俺にはよくわからない気がするが、明日よんでみよう。
STMってなんじゃらほい。interopの小間使いか(ぉぃ)

683デフォルトの名無しさん: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
684デフォルトの名無しさん:2007/02/12(月) 09:43:53
>>681
bだろ。
同期を取るには二つ方法があって、MVarという古典的な共有変数を使っても良いし、
STMという仕組みでロックなしに共有状態を操作しても良い。
STMはちゃんと使ったことがないけど、たぶん次のような特徴がある。
・MVarでできることはなんでもできる。
・明示的にロックをエミュレートしたりしない限り、デッドロックを気にする必要がない。
・(どの程度か知らないが)遅い。

詳しくは、リファレンスや、そこからたどれる論文を読んでくれ。
685デフォルトの名無しさん: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
686685:2007/02/12(月) 12:47:59
あ、間違えた
型が合っても動作が違う
  (...)
  fmap concat $ zipWithM dive dirps paths
  (...)
  where
  dive False p = return [p]
  dive True p = dirrec p
687デフォルトの名無しさん:2007/02/12(月) 13:04:43
".",".."だけを特別扱いすれば良いような気がする。

getRecursiveContents :: 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]
688ちっとも理解が進まねぇorz:2007/02/12(月) 14:27:04
>684

ありがと。
どうせ同期を取るのは数秒に一回〜1秒に数回程度で、別に遅くてもいいから
STM使ってみるよ。ghc6.2では使えないんだよね。
689デフォルトの名無しさん:2007/02/12(月) 14:28:38
getRecursiveContents :: FilePath -> IO [FilePath]
getRecursiveContents 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するにはどうすれば良いんだろう。
690デフォルトの名無しさん:2007/02/12(月) 21:47:25
haskell-mode-2.2 がelisp errorになる
691683:2007/02/12(月) 22:38:10
答えてくれた人たちありがとう。
がんばってソース読んでみる。

「あるディレクトリ以下の全てのログファイル
(拡張子固定)をすべて集計」ってのをやりたかったんだが
意外とめんどいコードが要るのな。
692デフォルトの名無しさん:2007/02/12(月) 23:35:19
どちらかといえばHaskellでやる事じゃないな
693デフォルトの名無しさん:2007/02/13(火) 00:04:56
言語としては悪くないんだが、ライブラリがね…
694デフォルトの名無しさん:2007/02/13(火) 00:16:42
>>693
素人は引っ込んでいてもらえますか?
695デフォルトの名無しさん:2007/02/13(火) 00:25:50
>>694
俺が何か間違ったことをいったか?
例えば、getDirectoryContentsにもっと短い名前を与え、
ファイルパス操作関数を用意するだけで、>>683みたいなコードはずいぶん書きやすくなる思うが。
696デフォルトの名無しさん:2007/02/13(火) 00:45:53
短くして何する関数か名前から推測できなくなったらそれはそれで嫌な気が。
よく使うような関数は用意しといてってのには同意。
697デフォルトの名無しさん:2007/02/13(火) 01:07:09
>>695
思った通り素人だ。
CかJavaのプログラマだろうな。
しかも学生。
推測は当たってたか?
698デフォルトの名無しさん:2007/02/13(火) 01:28:02
>>697
うざい
699デフォルトの名無しさん:2007/02/13(火) 01:59:40
>>695=698
気持ちよく書き込んでいたところすまないね。
ここはそういう話をする所じゃないんだよ。
関数名が長いだとか短いだとか、ハンガリアンがどうのこうの、コメントはこうかきましょうだの、
ここの常連はそういう話はとっくに聞き飽きてるの。
700698:2007/02/13(火) 02:11:06
>>699
695 ではない.
必要ない書き込みでスレを無駄に消費しているお前がうざいだけ.
これも無駄なレスではあるが.
お前の無駄な書き込みがこのスレから消えてくれることを切に願う.
701デフォルトの名無しさん:2007/02/13(火) 03:22:57
>>700
> これも無駄なレスではあるが.
わかっていて書かずにはいられないとは、リアル厨房か?
どうせ何も本質を理解していないんだろう?
半年ロムってろよ。
702デフォルトの名無しさん:2007/02/13(火) 08:42:38
>>694
2chで「素人は引っ込んでろ」って、馬鹿?
むしろ玄人様が学会にでも行けよ。
703デフォルトの名無しさん:2007/02/13(火) 12:34:09
>>702
興奮してるのと、摩訶不思議な2ch観を持ってるのは十分に伝わってくるけど、
文章全体としては何が言いたいのかさっぱりわからない。
704デフォルトの名無しさん:2007/02/13(火) 13:59:52
>>690
elispもHaskellもよくわからないけど
haskell-indent.el l.319 の :trype を :type にするとエラーは出なくなった
705693:2007/02/13(火) 18:44:48
>>699
>関数名が長いだとか短いだとか、ハンガリアンがどうのこうの、コメントはこうかきましょうだの、
俺だってソフトウェア工学の話がしたいわけじゃない。
>>691が言っているような単目的のコードを快適に書き散らすには
関数名の長さは重要だと思っているから、そう書いた。

それから、判り難かったかもしれないが、>>693>>692へのレス。
706デフォルトの名無しさん:2007/02/13(火) 23:02:55
副作用を禁止して型とかの制限機構を入れたLispってことでいいのか?

707デフォルトの名無しさん:2007/02/13(火) 23:36:34
関数型プログラミングしか出来ない(出来るが非常に回りくどい)関数型言語は
結局生産性悪いと思うんだけどどうだろ
Lisp系みたいなマルチパラダイム言語が一番使いやすいなぁ
708698:2007/02/13(火) 23:48:28
それを言っちゃあお終いよ
709デフォルトの名無しさん:2007/02/13(火) 23:50:42
>>707
今の段階ではね。
でも、まだ研究が煮詰まってないから何とも言えないな。
710デフォルトの名無しさん:2007/02/13(火) 23:50:43
ど素人が質問するけど、
Haskellでなんちゃらエンジンみたいなの作る場合、
他の言語と比べてけっこういいもんができるそう?
711デフォルトの名無しさん:2007/02/13(火) 23:53:28
Haskellでなんちゃらエンジンを作れる人が他の言語でなんちゃらエンジンを作ると良いものができるんじゃない?
712デフォルトの名無しさん:2007/02/14(水) 00:05:22
言語が違ったぐらいで出来栄えがそんなに変わるかなあ。
とか。
むろんケースバイケースだけども。
713デフォルトの名無しさん:2007/02/14(水) 00:18:33
>>707
Haskellみたいに関数型と手続き型が普通に使えれば十分だと思ってしまうんだが、
そうでもないものなの?
714デフォルトの名無しさん:2007/02/14(水) 01:40:35
普通には使えないと思う
715デフォルトの名無しさん:2007/02/14(水) 02:03:12
ひさしぶりにHaskellをGHCでやってみた
なんでこんなにコンパイル遅いの?
だれのせい?
頭のいい奴がつくってこの出来?
716デフォルトの名無しさん:2007/02/14(水) 02:47:05
>>715
Cコンパイラと比べてないか?
言語仕様がどれだけ複雑か考えただけでも遅くなるのは当然だろ
717デフォルトの名無しさん:2007/02/14(水) 02:56:37
なんで当然なのか教えてくれ
718デフォルトの名無しさん:2007/02/14(水) 03:10:02
直感
719デフォルトの名無しさん:2007/02/14(水) 03:28:07
>>717
言語仕様が複雑だからだろ。
720デフォルトの名無しさん:2007/02/14(水) 03:52:54
無限リストって怖くね?
721デフォルトの名無しさん:2007/02/14(水) 03:57:33
OCamlと比べてもコンパイルが遅いのは遅延評価とかモナドとか型クラスとかのせいですか?
722デフォルトの名無しさん:2007/02/14(水) 06:16:39
コンパイルの遅さよりもバイナリのでかさの方が問題だ
723デフォルトの名無しさん:2007/02/14(水) 06:24:24
D は言語仕様複雑だけど速い。
要は、

・ 言語仕様が高速なコンパイルに向いているかどうか
・ 最適化をどのくらいやっているか
・ コンパイラのコードが洗練されているか

とかの問題。
724デフォルトの名無しさん:2007/02/14(水) 09:45:34
>・ 最適化をどのくらいやっているか
>・ コンパイラのコードが洗練されているか

はともかく

> ・ 言語仕様が高速なコンパイルに向いているかどうか

は、高速なコンパイルができる→機械語との対応が簡単→言語仕様が簡単、
って言わないのかな‥‥

725デフォルトの名無しさん:2007/02/14(水) 10:34:11
人間にとっての容易な仕様と、コンパイラにとっての容易な仕様は別物、
ってことじゃないかなぁ。

Dの場合、「コンパイラ実装に優しい言語仕様」というのをはっきり掲げてるわけだけど、
それは通常の会話に出てくる「シンプルな言語仕様」というのとは、指しているものが
だいぶ異なっているような気がする・・・。
726デフォルトの名無しさん:2007/02/14(水) 11:27:04
まあコンパイルなんてふつうは遅いものじゃん。
スクリプト言語みたいに実行できるDが異常
727デフォルトの名無しさん: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!
728デフォルトの名無しさん:2007/02/14(水) 21:59:17
数学の専門用語の和訳には数学の文化があって、
「カテゴリー」みたいな一般的な用語であっても、
専門用語と分かるように難しい言葉を当てることが多い。

一方、情報化学では、カタカナのまま使うことが多いので、
その辺、語感に温度差があるように思える。
"Categories for Working Programmers" みたいなのが
あると、なかなか楽しい気はする。


> AAで圏論 Coming soon!
期待してるぜ!
729デフォルトの名無しさん:2007/02/14(水) 22:11:11
> AAで圏論 Coming soon!
wktk!!
730デフォルトの名無しさん:2007/02/14(水) 22:12:33
数学用語ってかっこいいよな
731デフォルトの名無しさん:2007/02/14(水) 22:45:54
VIPPERの俺様がWEBに転がっている情報処理の2006年3月号で
圏論を勉強してやっているのだが、定義4までは理解できるが、
肝心のモナドが出てくる定義5と6が意味不明だ。

天才エスパーが3行で解説してプラトンのイデア界のモナドに俺を接触させろ!おねがい (ぅふ
732デフォルトの名無しさん:2007/02/14(水) 22:54:40
まずはその定義をここに書くんだ
733デフォルトの名無しさん:2007/02/14(水) 23:09:56
>>732
ttp://www.ipsj.or.jp/07editj/promenade/4703.pdf

浪人の先生 これでございあす。
前半は糞クイズでございやすが、後半がモナド入門でやす。

4と5の間には越えられない壁がw

おねがいするお!
734デフォルトの名無しさん:2007/02/14(水) 23:44:33
>"Categories for Working Programmers" みたいなのが

The Haskell Programmer's Guide to the IO Monad ― Don't Panic
http://stefan-klinger.de/files/monadGuide.pdf
こんなの?
735デフォルトの名無しさん:2007/02/15(木) 00:11:39
>>733
3行で説明するのは俺には無理.

まず定義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 = (:[])

これらを図に代入して,ちゃんと可換になることを確認するよろし.
736デフォルトの名無しさん:2007/02/15(木) 00:18:09
こっちも同様に確認するとμ,ηの雰囲気がより分かるかも.

2. 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
737デフォルトの名無しさん:2007/02/15(木) 00:49:19
やっと分かった!
drop 5もreverseもnullも自然変換で、
map succやallは自然変換でないと。
前者は構造のみを扱い、後者は要素が絡んでいることを反映しているのか。

これ考えた奴は天才だな。
738デフォルトの名無しさん:2007/02/15(木) 00:50:21
次に定義6.こっちも具体例が条件を満たすことを確認すると見える.

1. リスト函手.これはありがたみが分かりづらい.
・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
と書けるようになってる.
739デフォルトの名無しさん:2007/02/15(木) 01:06:12
定義5の可換を具体例で示すことはできた。
が、『μが結合則、ηが恒等元の役割をする』というところがピンとこない。
なにとぞ、悟りの光をお与えください。

740デフォルトの名無しさん: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  …代数で言うところの恒等元,単位元
741デフォルトの名無しさん:2007/02/15(木) 03:45:58
>>740
dクス 結合法則のほうは分かったw  中置記法が味噌かよwww
中置記法で書くと確かに結合側に見えるw
麻呂は前置記法で書いていたので、どう見ても結合法則ではなく可換を意味しているようにしか
見えなかったでおじゃるw


恒等元のほうは、まだ分からんw
ηだけで恒等元??  (ημ)で恒等元? 
でもサ変と右辺でημとμηでひっくり返っているし

もう3行ばかり解説頼むw
742デフォルトの名無しさん:2007/02/15(木) 07:50:31
>>741
一般に,二項演算 * に対して e が恒等元であるとは
任意の a に対して e * a = a * e = a を満たすことを言う.
μを中置記法で読めば,最後に出てくる式はこれと同じ.
743デフォルトの名無しさん:2007/02/15(木) 09:20:05
>>740
凄い! なんかわかった気になる。
そうか、μをfunctor間の演算とみなせばよかったのか。

ところで>738の例で
Maybe functorがf* = Just . f
とあるけど、これでfindBornToday*が
Addressbook -> Maybe Person
から
Maybe Addressbook -> Maybe Person
になるんだろうか?
fをもちあげないといけない気がするんだが…
744デフォルトの名無しさん:2007/02/15(木) 10:25:48
>>743
そのとおりで,こちらのミス.手抜きをしたのがいけなかった.以下が正しい.

f* (Just x) = Just (f x)
f* Nothing = Nothing
745デフォルトの名無しさん:2007/02/15(木) 10:35:57
ああまたミス.f* (Just x) = f x,f* Nothing = Nothing.起きたばかりだけど寝てくる.
746デフォルトの名無しさん:2007/02/15(木) 18:09:27
lispとどっち勉強するか迷ってます
lispよりも強力なのがhaskellってことでいいのでしょうか?
強力というのは最小限の手間で複雑な処理がかけるという意味で


747デフォルトの名無しさん:2007/02/15(木) 18:40:24
>>746
迷ったなら両方やっとけば。
Lispは風呂敷。なんでもリストでつつんでしまう。良く言えば柔軟。悪くいえば節操がない。
Haskellはディナー用食器セット。テーブルマナーがわかっていれば心地良い。
748デフォルトの名無しさん:2007/02/15(木) 18:56:11
>>747
>Haskellはディナー用食器セット。テーブルマナーがわかっていれば心地良い。
でも調理は自分で、でも何故かアレルギー反応する人がいるのがおもしろい。

749デフォルトの名無しさん:2007/02/15(木) 19:59:31
昨日は詳しい人がいたのね。

HaskellのMonadって、実はKleisliの方が近いんじゃないか、と思うんだけど、
何でMonadと呼ばれているんだろう?

(T,η, *)と(M, return, flip (>>=))が対応してるのに対して、(T, η, μ)とは
間接的にしか対応してないのに。Monadなんて使わなければ関連する定義
も1つ減って幸せな気がする。
750デフォルトの名無しさん:2007/02/15(木) 22:08:19
対象→例えば数字だったり、式だったり、式+式だったり
群  →対象の集まり
圏  →対象と射の集まり

これで認識あってる?
751デフォルトの名無しさん:2007/02/15(木) 22:21:00
モナドは函手の間の演算だってそういうことですか・・・。
752デフォルトの名無しさん:2007/02/15(木) 22:30:13
>>750
数学の用語としてだったら、群は間違ってる。
群は、可逆な演算の定義された集合の事(厳密な言い方でないけど)。
例えば、整数の集合に足し算と引き算を定義すれば、群である。
圏は一応あってると言っていいと思う。
753デフォルトの名無しさん:2007/02/15(木) 22:33:50
可逆という言葉がわからん
集合という言葉の定義がわからん
754デフォルトの名無しさん:2007/02/15(木) 22:39:02
群はモノイドでかつ任意の元に対して逆元が存在するもの。
755デフォルトの名無しさん:2007/02/15(木) 22:40:22
756デフォルトの名無しさん:2007/02/15(木) 22:48:49
やっぱりボチボチと圏論わかってきてるひと増えてるんだね。
でも、やっぱりよくわからのだがこれ一体なんの役に立つんだ?
757750:2007/02/15(木) 22:50:04
たぶん、オブジェクト指向のようなものだと思うんだが
758デフォルトの名無しさん:2007/02/15(木) 22:55:56
>>749
一般にプログラミング上の専門用語は、
「寓意的・即物的」であることが好まれるからだろう。

"Kleisli" なんていう、
どう読めばよいのかも分からない人名をつけるよりも、 
"Monad" なんて単語のほうがずっとイメージしやすいしね。

この特徴は、プログラミングが「科学」ではなく、
まさに「工学」であることの証拠のように思える。

ていうか、ここら辺はむしろ「科学」のほうが異常なんだと思う。
発見者(又は、偉大な業績を残した先人達)の学問上の
功績を称えるために、発見したものに対して
その人の名前を冠する、という悪しき慣習のために、
新しい概念に対して本当にふさわしい名前をつけることが
出来てないんだよ。
759756:2007/02/15(木) 22:56:08
>たぶん、オブジェクト指向のようなものだと思うんだが

なるほど。
でも、だとしたらコストが高すぎる。一体どれだけ時間かかるんだ。

ていうか、いい加減コーディングスタイル確立してくれ。
というわけで偉い人がんばってくれ。
760デフォルトの名無しさん:2007/02/15(木) 23:01:46
>>758
Haskell改名要求キター
761デフォルトの名無しさん:2007/02/15(木) 23:02:08
>>755

data Set
  = Empty
  | Pair Set Set
  | Union Set
  | Infinity
  | Replacement Fun Set
  | Power Set

こんな感じ?
762デフォルトの名無しさん:2007/02/15(木) 23:06:59
>>759
確かにHaskellって名前あんまり良くないかも。
763デフォルトの名無しさん:2007/02/15(木) 23:09:07
>>760
"Haskell" 自体は「専門用語」ではないから桶。
あれは「固有名詞」であって、云わば商品名のようなもの。
どんな名前をつけようが関係ない。
764デフォルトの名無しさん:2007/02/15(木) 23:12:46
>749 >758

そっか、HaskellのMonadと圏論のMonadは別物だったのか…ちょっと驚き
765デフォルトの名無しさん:2007/02/15(木) 23:12:48
で、結局 Kleisli って、どう読むの?
766デフォルトの名無しさん:2007/02/15(木) 23:39:55
クライスリーだそうです。
767デフォルトの名無しさん:2007/02/15(木) 23:40:59
>>742
dクス!! 定義5までは理解した気がするぉ!(^ω^)v 


(T μ η) が (対象 演算子 単位元)か。 しかし対象 T は T 1個だけか?
実は理解してないか?(^ω^;)?


定義6についてはこれからエロ画像見ながら考えるぉ
768デフォルトの名無しさん:2007/02/15(木) 23:44:10
Tは自己函手だ。
μ、ηは自然変換。
769デフォルトの名無しさん:2007/02/16(金) 00:28:35
>(T μ η) が (対象 演算子 単位元)か。

モノイドとしてみた場合の話だぉ。
770デフォルトの名無しさん:2007/02/16(金) 01:03:24
>モノイドとしてみた場合の話だぉ。

モノイドとしてみるならTは集合としてみるべき。
771デフォルトの名無しさん:2007/02/16(金) 01:46:57
>>756
すごく大雑把に言うと,チューリングマシンや
λ計算などがあったところに,新しい定式化として
圏論に基づくものが現れたという背景がある.

現在,普通のプログラマはチューリングマシンや
λ計算を知らなくても特に問題は起きないけれど,
それと同じようなものだと考えるのが順当だと思う.
(もちろん知ってたほうが良いのは確かだけど,
 とりあえず大雑把なところを抑えておけば十分.)

ラーニングコストが高いのは,まだ新しい理論である
ということと,従来の手法よりも数学的に取り扱いやすい
枠組みとして導入されたことがあるので,教育用に
整理されてない現段階では,好きな人がやるものだと
思ったほうがよいと,個人的には思う.
772デフォルトの名無しさん:2007/02/16(金) 01:56:04
>>764
別物というとちょっと語弊があって,
Kleisli triple と monad は一対一対応するので,
どちらで定義しても「本質的には同じもの」になる.

言い方としては,
 Haskellでは monad は Kleisli tripleで定義される
というのが間違いないと思う.
773デフォルトの名無しさん:2007/02/16(金) 02:06:17
>>771
まだまだ未開拓なのか・・・。

>>772
>Kleisli triple と monad は一対一対応するので,
>どちらで定義しても「本質的には同じもの」になる.

!!ですよね。
774デフォルトの名無しさん:2007/02/16(金) 02:45:29
     ...| ̄ ̄ | < この話はいつ終わるのかね?
   /:::|  ___|       ∧∧    ∧∧
  /::::_|___|_    ( 。_。).  ( 。_。)
  ||:::::::( ・∀・)     /<▽>  /<▽>
  ||::/ <ヽ∞/>\   |::::::;;;;::/  |::::::;;;;::/
  ||::|   <ヽ/>.- |  |:と),__」   |:と),__」
_..||::|   o  o ...|_ξ|:::::::::|    .|::::::::|
\  \__(久)__/_\::::::|    |:::::::|
.||.i\        、__ノフ \|    |:::::::|
.||ヽ .i\ _ __ ____ __ _.\   |::::::|
.|| ゙ヽ i    ハ i ハ i ハ i ハ |  し'_つ
.||   ゙|i〜^~^〜^~^〜^~^〜
775デフォルトの名無しさん:2007/02/16(金) 02:52:32
ほかの面白そうな話が始まったら
776デフォルトの名無しさん:2007/02/16(金) 03:09:00
main = この話 >> main
777デフォルトの名無しさん:2007/02/16(金) 04:22:40
いや、この路線でいこう。

おれは、参加できないが。
778デフォルトの名無しさん:2007/02/16(金) 11:52:48
結局、実際に有用なのはモナドのどの性質なんだ?
射の合成則なのか? 

対象に順番に射が作用しているという点で、結合則を利用しているようには見えないんだが?

ちんぷんかんぷんだぜ
779デフォルトの名無しさん:2007/02/16(金) 13:40:19
python経由でならc++もよべるんですよね?
780デフォルトの名無しさん:2007/02/16(金) 15:02:44
ごめん,だいぶ長文になった.うざかったらスルーしてくれ.

>>778
「射の合成則」は monad ではなく圏の性質なので
これを落とすと圏論で議論ができなくてうれしくない.

Monad を Kleisli triple (T,η,*) で定義したとき,
どれが利いているのかと言うと「全部そろって意味がある」
という答えになってしまう.

では,どんな意味があるのかというと,標語的に言えば,
「monad は『計算』をモデル化できる構造」
となる.これはもう少し説明すると η, * が実際にどう働くかが
見やすくなるので,せっかくだから Haskell の計算をモデル化してみる.
781デフォルトの名無しさん:2007/02/16(金) 15:09:47
続き.本当は以下の例は正しい Haskell の計算モデルでないし
定義もいくらか怪しいけれど,イメージということで許していただきたく.

>>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 の条件が必要なのが理解できる)
782デフォルトの名無しさん:2007/02/16(金) 20:16:29
>781

おお、何だか凄そうな人が!
いくつか質問させてください。

(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が必要になるのは、名前があるからでしょうか?
783デフォルトの名無しさん:2007/02/17(土) 01:44:14
>>780-781
Haskellの旦那!ありがとう、かなり理解がすすんだぉ(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)

こんな風に使える?みたいな?
784デフォルトの名無しさん:2007/02/17(土) 01:50:55
(T μ T)
泣き顔に見える
785デフォルトの名無しさん:2007/02/17(土) 02:07:03
頼むからその記号のそれぞれが何を意味してるのか説明してくれ。
786デフォルトの名無しさん:2007/02/17(土) 03:20:06
この一連の流れ凄いけどいくつか自作自演しているだろ。
レスポンスがおかしい。
787デフォルトの名無しさん:2007/02/17(土) 03:44:06
>>782
(1) 普通の計算の定義を採用すると,きちんと証明できる.
(満たさない計算もあるだろうけれど,直感に反する気がする)
ηが自然変換であることは Kleisli triple の条件に含まれている.

(2) 『計算』の合成が,直感と整合することの保証.
右辺が何を意味してるかを考えると,左辺が出る.

(3) その式くらいなら CCC で解釈できるんだけど,それは本当に
「自然」な解釈なの? ということで Kleisli でやることを
考えたそうな.なお,λ計算を monad で解釈するためには,
Kleisli + CCC + 整合性みたいな構造が必要.
788デフォルトの名無しさん:2007/02/17(土) 08:42:43
ηが自然変換であることも重要なん?
789デフォルトの名無しさん:2007/02/17(土) 09:44:29
要するに、f : A -> T(B)という型の関数の集まりに対して、それが圏を構成するのに必要な
合成演算子とIdの条件を示した、ってことなのかな。
で、圏を構成すると、合成について閉じることと結合法則は保証されるから嬉しい。
まあ嬉しいが、弱い嬉しさだなあ…。
790デフォルトの名無しさん:2007/02/17(土) 10:26:39
>>788
技術的には自然変換でないと monad の有用な性質が
成立しないので困る,ということがある.
概念的には自然変換の自然っぷりに関連するんだけど,
 ηは『値』を『計算』として解釈しなおすだけなんだから,
 それが自然変換にならないわけがない.
というのが自分の持ってるイメージ.
791デフォルトの名無しさん:2007/02/17(土) 10:30:47
> monadの有用な性質
って結合法則?
なんとなく、自然変換にしとくと、添字を省略した等式変形が出来るというイメージが
792デフォルトの名無しさん:2007/02/17(土) 10:55:45
>>791
有用な性質はたくさんあって,例えば結合法則を含む性質
として「monad と代数が一対一対応する」という定理がある.
ほかにもいくつもの定理や普遍性が成立する.

もちろん自然変換自体が扱いやすいのもそうですね.
793デフォルトの名無しさん:2007/02/17(土) 11:12:37
>>785
記号の定義は>>733に引用されているPDFに書いてある。
ジンマシンが出そうな式だが。
794デフォルトの名無しさん:2007/02/17(土) 12:17:53
>>785
意味は存在しない。というより意味をつけてしまうとダメだ。
なんのためにモナドにまで抽象化したんだって話になる。
個々のモナド(Maybe,List)とかに落とせば意味はつけられるからそこを考えたほうがいい。
795デフォルトの名無しさん:2007/02/17(土) 18:02:05
モナドの合成は、Kleisli category上ではどういう操作に対応するの?
796デフォルトの名無しさん:2007/02/17(土) 19:43:20
>>795
函手 F 上の monad と G 上の monad が与えられたとき,
合成函手 F G 上の monad を構成することが合成に相当する.

合成には複数の方法があることも,全く存在しないこともある.
797デフォルトの名無しさん:2007/02/17(土) 20:38:44
ListのKleisli tripleが
(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)

にはなりそうもないね…
798デフォルトの名無しさん:2007/02/17(土) 22:03:30
手続き型に首まで浸かったVipper様が今晩もやってきましたよ。
Kleisli 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*を合成
               した上で、その合成関数の引数を値型から参照型に変えたものは同じ物。
799デフォルトの名無しさん:2007/02/17(土) 22:21:44
この場合のKleisliカテゴリは、

・対象Cは値型変数と参照型変数
・関数 f は値型引数→参照型返り値、関数 f* は f の参照型引数、参照型返り値バージョン
・恒等写像η_A とは、値型変数を参照型変数へ変える関数。
 (ηが関数 f に作用すると、f ⇒ f* の変換をする演算子)
・二つの関数 f と g の合成が、g* 。f になるのは、fが吐くのは参照型の返り値だから
 g は参照型の引数をとる g* バージョンでないと困るから。

となる?

これは、アトムを値型、リストを参照型とみなしたリストモナドと等価かな?(^ω^?
800デフォルトの名無しさん:2007/02/18(日) 11:24:35
monadに依存している時点でHaskellは既に敗北しているよな
801デフォルトの名無しさん:2007/02/18(日) 11:53:02
liskell キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
802デフォルトの名無しさん:2007/02/18(日) 11:56:06
>>800
ネタにマジレスいくないとおもうけど
モナドじゃなかったら何を使えばよかったと思う?
803デフォルトの名無しさん:2007/02/18(日) 12:40:55
>>802
副作用を許す
無駄に副作用をなくすのにこだわりすぎ
804デフォルトの名無しさん:2007/02/18(日) 12:46:15
副作用のある関数とない関数に別の型を与えるかどうか、と言う話で、
結局、どれだけ細かく型を付けるかによるトレードオフだよな。
俺は別扱いするのがコストに見合うと思うが。
805デフォルトの名無しさん:2007/02/18(日) 12:46:57
ピュア言語に汚れろというのはナンセンスだろw
OOPL同様ピュアを反面教師としてハイブリッド型が生まれるのだ。
806デフォルトの名無しさん:2007/02/18(日) 12:51:37
>>805
そういう話じゃない。
藻などを使うのが理想的かどうかってことだろ。
807デフォルトの名無しさん:2007/02/18(日) 12:54:19
手続き型な人には不自然といわれ
関数型な人には関数的じゃないといわれる
IOモナドの何と不憫なことか
808デフォルトの名無しさん:2007/02/18(日) 13:11:09
ギリシャ文字フリーキャンペーン中です
809デフォルトの名無しさん:2007/02/18(日) 13:11:55
ΣをSigmaと書きましょう
810デフォルトの名無しさん:2007/02/18(日) 13:49:10
Concurrent Clean の一意型はどう思われますか?
811デフォルトの名無しさん:2007/02/18(日) 14:21:23
>>808
バルバロイはすっこんでろ!
812デフォルトの名無しさん:2007/02/18(日) 16:17:19
ギリシャ文字ってうざいよね
813デフォルトの名無しさん:2007/02/18(日) 16:53:02
>>806
海草なども使えばいいってことですか?
814デフォルトの名無しさん:2007/02/18(日) 22:07:24
ようやく元の馬鹿スレに戻ってきたなw うれしいぜ
815デフォルトの名無しさん:2007/02/18(日) 22:28:20
もったいぶった馬鹿よりはマシだな
816デフォルトの名無しさん:2007/02/18(日) 23:24:26
このスレは正真正銘のHaskeller達で構成されているわけではなくて、
Haskelになんとなく関わっていることで自分が賢くなったと思い込みたい人間が大半だからな。

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

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

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

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

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

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

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

あー。早とちり。

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

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

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

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

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

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

でも、多くの場面では、カチカチの型が憑いているメリットの方が大きいと思うけれど。
846デフォルトの名無しさん:2007/02/20(火) 19:30:22
冷静に考えてみると、動的型言語と同等の力が必要ならいつでも
Data.Dynamicを使える訳で、そうしないのは気持ちの問題に過ぎないのかも。
型安全でないHaskellライブラリなんて寒気がする、とか。
847デフォルトの名無しさん:2007/02/20(火) 20:01:39
848デフォルトの名無しさん:2007/02/20(火) 20:04:38
どこでもevalれないと同等とは言いたくないぜ。
メタな要素がまざると、型とか意味論的に都合が悪いのかな
849デフォルトの名無しさん:2007/02/20(火) 22:41:56
つ hs-plugins
850デフォルトの名無しさん:2007/02/20(火) 22:43:04
ああ、まあ hs-plugins の eval は IO だから「どこでも」じゃないな
851デフォルトの名無しさん:2007/02/20(火) 23:01:37
HaskellのevalはIOとして外側の世界に出して行うしかない。
LispのevalはLispの世界で定義されている。
この差は大きいと思う。
852デフォルトの名無しさん:2007/02/20(火) 23:02:53
動的なプログラムはデバッグきつい。
性的なほうがいいね!
853デフォルトの名無しさん:2007/02/20(火) 23:11:08
最初はきついかも知れんが、動いていればだんだん滑らかになるよ。
きつい方が気持ちよい
854デフォルトの名無しさん:2007/02/24(土) 00:52:28
>>831
圏論の基礎は数学者向けの基礎なので、
普通の人は違う本を読んだほうがいいらしい。
855デフォルトの名無しさん:2007/02/24(土) 01:58:15

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


まぁまぁ面白いな
909デフォルトの名無しさん:2007/03/09(金) 03:49:25
>>907
知らなかった…。初心者にはあり難い。
910デフォルトの名無しさん:2007/03/09(金) 12:39:44
main = readLn >>= print . (1+)
を -ddump-parsed つけてコンパイルしてみたら(GHC6.6)

==================== Parser ====================
main = (readLn >>= print) . ((1 +))

って表示されたんだが、このパースは間違ってる。
実際、これをコンパイルすると型のミスマッチのエラーが起きるし。

本来は
main = readLn >>= (print . (1 +))
とパースされるわけで、実際処理系自体はそのようにパースしてるはず。
911デフォルトの名無しさん:2007/03/09(金) 13:05:50
結合の弱い順に演算子を使った
main = a >> b || c && d == e : f + g * h ^ i . j
に対しては
main = ((((((((a >> b) || c) && d) == e) : f) + g) * h) ^ i) . j
となった。どうも、演算子の結合強度を全く考慮していないらしい。
といっても、演算子の結合強度はパースしてみないと分からないので仕方ない。
912デフォルトの名無しさん:2007/03/09(金) 13:11:30
代わりに-ddump-rnを使えば良さそう。
913907:2007/03/09(金) 17:16:48
>>912
あー、ほんとだ。こっちの方が正しいね。サンクス。
914デフォルトの名無しさん:2007/03/11(日) 12:39:27
main = writeFile "a.txt" "こんにちは"

GHC 6.6 Windows環境で上記ソースをUTF-8にして実行してみたんですが、
出力ファイル(a.txt)の中身が「S?kao」となってしまいます。
日本語を正しく出力するにはどうすればいいんでしょう?
915デフォルトの名無しさん:2007/03/11(日) 12:42:46
>>914
変換が要る。
>>402-414あたり参照。
916デフォルトの名無しさん:2007/03/11(日) 13:11:16
毛唐に任せてたら対応がいつになるか分かったもんじゃないぜ。
だれか直してパッチ送りつけろ。
917デフォルトの名無しさん:2007/03/11(日) 14:21:50
918914:2007/03/11(日) 15:47:50
>>915
どもです。IOの標準ライブラリがUTF-8対応されたわけじゃないのですね。

日本語がどうしても必要な時はWinHugs使ってみます。
こちらはこちらでアンインストールできないバグがありますが・・・。
919デフォルトの名無しさん:2007/03/12(月) 00:09:24
これってWindowsAPIとか呼べますか?
920デフォルトの名無しさん:2007/03/12(月) 00:18:43
これってどれよ
921デフォルトの名無しさん:2007/03/12(月) 00:52:28
これっちゃこれよ
922デフォルトの名無しさん:2007/03/12(月) 01:27:08
importsのしたにSystem.WIn32.*ってあるな。
でもリファレンスには載ってない。System.Posix.*は載ってるのに。
923デフォルトの名無しさん:2007/03/12(月) 02:44:10
>>917
それは違うんじゃないか?
> * String/ByteString/UTF8String/UTF16String as filename
まあファイル名にも使えて然るべきだけど。
924デフォルトの名無しさん:2007/03/13(火) 16:39:59
>>923
コード変換が実装されない一番の原因は、今のGHCのIOライブラリが拡張しにくい
構造になっていることだから、それをまずなんとかするのが先決だ。
で、なんとかしようというのが>>917の提案だろう。
枠組さえできれば、コード変換を実装する事自体は難しくない。
925デフォルトの名無しさん:2007/03/13(火) 23:15:59

おまえらWindowsでHaskellしてんの?
Linuxの場合、Fedoraはいろいろ対応してるぽいが、
Debian系のUbuntuは使用不可能?
926デフォルトの名無しさん:2007/03/14(水) 02:00:13
>>924
いつのまにか書き換えられてるな。
・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)のコードポイントそのまま使うんじゃないの?
つうか、リストじゃないの?そんなのありえるの?
927デフォルトの名無しさん:2007/03/14(水) 15:05:25
>>926
>個々の文字はどうするんだ?
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
もうちょっと詳しく。
928デフォルトの名無しさん:2007/03/14(水) 15:50:23
>>925
自分でコンパイルするとか
929デフォルトの名無しさん:2007/03/14(水) 19:59:59

Haskellの型推論って中の人どんなふうに動いてんの?

Javaにはそんな機能ないけど、
例えばプリミティブ型もIntegerとかにして、
ぜんぶをObject型で扱えば、なんでも突っ込めるようになるはずだけど、
それとはまったく違う?


930デフォルトの名無しさん:2007/03/14(水) 20:36:44
>>929
型推論と多相型をごっちゃにしてないか?
型推論は純粋にコンパイル時の操作で、一旦型が推論されたら、
明示的に型を書いた場合と全く同じようにコンパイルされる。
多相型の実装の話なら、その通りで、Javaのオブジェクトと同様あらゆる型をポインタを介して扱っている。
931デフォルトの名無しさん:2007/03/14(水) 20:44:47
Haskell の日本語の本2冊を一通りみたんだけど、
関数を返す関数が見当たらなかった?ような気がする。
Lisp 等だと普通に lambda を返す様な事をするけど、
932ごめん。:2007/03/14(水) 20:57:49
Haskell の日本語の本2冊を一通りみたんだけど、
カリー化された関数は作成してるけど、
無名関数を明示的に返す関数は無かったような気がする。
そんなのはあんまり書かないのかな?
933デフォルトの名無しさん:2007/03/14(水) 21:09:44
>>931
無名関数を明示的に返すくらいなら、最初からカリー化を利用して
引数を導入しておいた方が楽だからじゃないだろうか。
ただし、すでに名前の付いている関数を返すことはときどきある。
f :: Int -> Int -> Int -> Int
f 0 = (+)
f 1 = (-)
f 2 = (*)
とか。これの延長で無名関数を返すこともあるだろう。
f 3 = \x y -> if y == 0 then 0 else div x y
934デフォルトの名無しさん:2007/03/15(木) 00:52:08
>>927
勘違いしてたらスマンけど…。

Stringable aは、Stringable aであって[Char]じゃない
→リストじゃない→リストを扱う関数が使えないのでは?

UTF8Stringとかってエンコーディング処理が隠蔽されてるんだと思うけど、
今のStringの置き換えにするには、単純な[Char]に比べて性能遅そうな気が。

あと、エンコーディング毎に型が別ってのは、正しいのかも知れないけど、
コンパイル後に対応エンコーディングを増やすってどうやるの?

っていうか、ByteStringってエンコーディングは何?

と、疑問が山ほど。
935デフォルトの名無しさん:2007/03/15(木) 11:29:25
>>934
>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。
936デフォルトの名無しさん:2007/03/15(木) 12:13:27
>[Char]だとGHCでは一文字あたり約20バイト必要だけど、

まじですか。
Charのデータ自体は4バイトだから、
リストノードひとつに16バイトも必要なの?
でも、ポインタひとつ4(or8)バイト食えばそんなもん…か?

>UTF-8配列なら1〜4バイトで済む。
UTF-8なら1〜6バイトではないかと。まあ20バイトの比ではないが。
937デフォルトの名無しさん:2007/03/15(木) 12:28:16
Stringのcons
  enter : 4bytes -- クロージャ進入関数へのポインタ
  Char : 4bytes -- headへのポインタ
  String : 4bytes -- tailへのポインタ
Char
  enter : 4bytes
  Char# : 4bytes -- コードポイント値
計20bytes

確かめたわけじゃないけど、これで実測と合う。

>UTF-8なら1〜6バイトではないかと。
Unicodeの範囲(0..0x10ffff)なら4バイト以下で表せる。
938デフォルトの名無しさん:2007/03/15(木) 12:56:40
>>935
Stringable.hsにはtoString, fromStringじゃなくて、toList, fromListが定義されてるのでわざわざ書く必要すらない。
名前が違うだけで型は全く同じ。

>>934
対応エンコーディングを増やすためには適当なデータ型を用意してStringableクラスのインスタンスにしてやればよい。

おおざっぱにはこんな感じ。

data MyString = MyString ByteString

instance Stringable MyString where
empty = MyString empty
head (MyString bs) = (bsから先頭1文字分取り出してChar型の値にして返す処理)
...
939デフォルトの名無しさん:2007/03/15(木) 13:16:51
> toList, fromListが定義されてるのでわざわざ書く必要すらない。

それはわかるけど、リストで使うときとStringableで使うときで
バンバンそんな変換してたら遅いじゃん?
メモリ節約どころの騒ぎじゃないじゃん?

> 対応エンコーディングを増やすためには適当なデータ型を用意してStringableクラスのインスタンスに

そう言う事じゃなくて、プログラムとして、エンコーディングをpluggableに出来ないじゃんと。
例えば、Stringable を使って作られたエディタが配布されてるとする。
そのエディタに対して、対応エンコーディング追加プラグインみたいのが作れないのでは、という事。
あるいはプラグインでなくてもいい。
そのエディタ作者は英語しか出来ずStringableで書いても、入出力はLatin-1しか考えてない。
で、これを作者が存在すらしらない、SJISString, EUCJPString, Big5String みたいのを扱えるようにするには、
どうすればいいの?毎回ソース書き換えてリコンパイル?
940デフォルトの名無しさん:2007/03/15(木) 14:04:02
リスト的な操作をするときにいちいちリストに変換してやるわけじゃないんだけど。
mapとかfoldrとかいった操作は効率の良い定義に置き換えることも出来るようになってる。

pluggableに関しては、今のStringable.hsはそういう作りになってないんだから、書き換えてリコンパイルするしかないじゃん。
941デフォルトの名無しさん:2007/03/15(木) 14:11:15
>それはわかるけど、リストで使うときとStringableで使うときで
>バンバンそんな変換してたら遅いじゃん?
リストとして使いたいなら従来どおりStringを使えば良い。
そのためのinstance Stringable String。
942デフォルトの名無しさん:2007/03/15(木) 17:41:28
リスト一般用の便利なライブラリと、
Stringable用の便利なライブラリがあるとき、
変換せずに両方混在させて使える?

pluggableは、String以前に、Haskellでそもそも可能なの?
コンパイル時に知らないsubtype(クラスのインスタンス)を、
動的にファーストクラス値で指定してロードってできるんだっけ?
943デフォルトの名無しさん:2007/03/15(木) 17:49:20
>リスト一般用の便利なライブラリと、
>Stringable用の便利なライブラリがあるとき、
>変換せずに両方混在させて使える?
使える。Stringはリストであると同時にStringableなので。
944デフォルトの名無しさん:2007/03/15(木) 18:25:47
Haskellは実装の多重継承がokなんだな。
いわゆるダイヤモンド継承問題はどうなってるんだろう?
945デフォルトの名無しさん:2007/03/15(木) 18:49:02
Haskellに実装の継承に相当する機能なんてあったか?
946デフォルトの名無しさん:2007/03/15(木) 21:16:41
これが噂のオブ脳
947デフォルトの名無しさん:2007/03/15(木) 23:51:15
>>943
話の流れからして、StringじゃなくてUTF8Stringとかでそれが出来るかって話だと思うが。
948デフォルトの名無しさん:2007/03/16(金) 00:36:24
>>947
どこをどう読むとそういう話になるんだ?
ともあれ、UTF8Stringはリストじゃないので、リスト操作関数は使えない。
949デフォルトの名無しさん:2007/03/16(金) 02:05:56
>>937
クロージャ進入関数って?
データが関数のポインタを保持するの?
950デフォルトの名無しさん:2007/03/16(金) 02:08:59
結局の所 http://darcs.haskell.org/SoC/fps-soc/Data/Stringable.hs を読めってことになるんだが、
UTF8StringとかのStringableな型ではmap,take,foldrとかのリスト操作的な関数がデフォルト定義として与えられている。
だけどPreludeの同名の関数たちとは型が違うから、単にimport Data.Stringableとすると衝突してしまう。
なので、実際に使う時はimport qualified Data.Stringable as S みたいにして、
Stringable用の関数は S.map, S.take, S.foldr のようにS.を付けて使うことで衝突を回避する。
951デフォルトの名無しさん:2007/03/16(金) 02:40:48
>>949
Haskellではデータ構造の一部が未評価のことがあり得るので、
評価用の関数ポインタを保持せざるを得ない。

>>950
基本的な関数はStringableクラスにもあるけど、
リストにしか対応していないライブラリも多い(例えばParsecとか)。
「リスト操作関数」という言い方が悪かったか。
952デフォルトの名無しさん:2007/03/16(金) 03:03:53
Parsecが使えない文字列なんて…。
っていうか、Stringableとリストのクラスを作るんだよね?(:)とかheadとかtailとか++とか!!とか。
それでも現行のリスト用ライブラリは使えないけど、じきに対応してくれるのを待つ、と。
でも構文的な問題が厳しいか。
953デフォルトの名無しさん:2007/03/16(金) 03:29:21
>>952
>Parsecが使えない文字列なんて…。
何を問題視しているのかさっぱり分からん。
従来ファイル名にはStringしか使えなかったのを、Stringableのインスタンスならどれでも
使えるようにしよう、という互換性を保った拡張であって、Stringで満足しているなら
Stringを使いつづければ良いんだが。
954デフォルトの名無しさん:2007/03/16(金) 03:56:39
Haskell ぼろぼろじゃん
955デフォルトの名無しさん:2007/03/16(金) 09:22:14
コンストラクタになる関数とパターンマッチで使う逆関数を用意したら既存のdataが拡張できるような仕組みがあればいいのに
遅そうだけど
956デフォルトの名無しさん:2007/03/16(金) 09:32:26
extendedList :: (a -> b -> b) -> b -> (b -> Maybe (a, b)) -> (b -> [a], [a] -> b)
extendedList cons nil match = (forth, back)
  where
    forth = unfoldr match
    back = foldr cons nil
957デフォルトの名無しさん:2007/03/16(金) 18:18:58
>>953
          非Latain-1  リストベースライブラリでの使用
String       ×         ○
Stringable     ○         ×
望まれる物   ○         ○

例えば、(メモリ効率の改善はなくなるが)
バイト列とStringの変換関数だけを提供するという解も有り得るかと。

あるいは、Stringableの方向性でいくなら、
Stringableをリストの「インスタンス」にするか、それが無理なら
リストとStringableを包含したクラスを作って、リストの構文でも扱えるようにすれば、
リストベースライブラリもわずかな修正とリコンパイルだけでStringableでも使用できるようになるのでは?
958デフォルトの名無しさん:2007/03/16(金) 19:26:12
>>957
・Stringという型とStringableというクラスを比較するのはおかしくないか?
・Stringでも非Latin-1の文字は使える。

俺ならこういう表にする。

       Parsec(リストのみ) 現行IO(Stringのみ)  提案IO(Stringable)
String       ○           ○             ○
UTF8String    ×           ×             ○
[Word8]      ○           ×             ×

>>917のリンク先の提案は、「IO」という縦の列の改善提案であって、
例えばUTF8StringがParsecで使えるかどうかとは関係ない話だと思うが。
「リスト的なコンテナ」を表現する型クラスがあっても良いとは思うけど、
それは少なくとも>>917とは別の話題だと思う。
959デフォルトの名無しさん:2007/03/17(土) 03:53:19
とすると、>>917>>914-916とは別の話題だったということか。

それはともかく、
・Haskell(Hugs/GHC)自体は、FPSは関係なく、ちゃんと
 CharにUnicodeコードポイントを(1byteずつに分けずにまるごと)入れて、
 readFileとかputStrとかが適切にデコード・エンコードしてくれる方向
・FPSは、それとは直交して、
 効率の良いString(able)クラスを作ろうとしていて、
 エンコーディングも扱う
と理解してOK?

しかし、せっかく作るStringableだが、
Parsecなどのリストベースのライブラリで使えないというのは、勿体ないとは思わない?
リスト派とStringable派にライブラリが分裂しちゃうじゃん。無駄じゃん。

文字エンコーディング機能が、
readFileとかの関数と、Stringableのインスタンスの両方に実装されるのも
DRYじゃないし、テキストを扱う流儀の分裂を招く。
960デフォルトの名無しさん:2007/03/17(土) 10:09:28
ByteStringでもPersecを使えるようにしようって話もあるみたい。
http://hackage.haskell.org/trac/summer-of-code/ticket/59
961デフォルトの名無しさん:2007/03/17(土) 12:27:33
>>959
>とすると、>>917>>914-916とは別の話題だったということか。
いや、>>917はGHCのIOライブラリを作りなおそうという話であって、Stringableの提案は
その一部に過ぎない。ので全体としては関係あると思う。

>しかし、せっかく作るStringableだが、
>Parsecなどのリストベースのライブラリで使えないというのは、勿体ないとは思わない?
>リスト派とStringable派にライブラリが分裂しちゃうじゃん。無駄じゃん。
確かに。

>文字エンコーディング機能が、
>readFileとかの関数と、Stringableのインスタンスの両方に実装されるのも
>DRYじゃないし、テキストを扱う流儀の分裂を招く。
これは仕方ないような。readFileがやるのは
外部エンコーディング <-> 内部エンコーディング
の変換で、例えばUTF8Stringが行うのは内部エンコーディング間の変換。
962デフォルトの名無しさん:2007/03/17(土) 15:46:20
よくわからんけど
(:)とか[]は
Stringableじゃ使えないのか。
963デフォルトの名無しさん:2007/03/17(土) 16:09:48
例えばUTF8Stringな s に対して 'a':s みたいなことは出来ない。
964デフォルトの名無しさん:2007/03/17(土) 16:25:48
Stringableとリストを共通クラス化しておかないと、
リストを使った実装群と、Stringableを使った実装群に分断される。

将来絶対、混乱や重複実装の元になって問題になるだろ。どうにかしろよ。
965デフォルトの名無しさん:2007/03/17(土) 16:29:23
リスト系関数使えないってかなりまぬけだ
966デフォルトの名無しさん:2007/03/17(土) 16:37:47
はぁ?頭悪い人か
967デフォルトの名無しさん:2007/03/17(土) 16:42:27
>>946
 >>944=Tucker!
 C++が最高だと思って相手構わず噛み付く痛い人だから
 相手にしなくておk

 monadic programming の主旨も理解できてないレベル
968デフォルトの名無しさん:2007/03/17(土) 16:42:50
>>966
使えるのか?
同名の関数があるってオチは無しだぜ?
969デフォルトの名無しさん:2007/03/17(土) 17:30:30
> Stringableとリストを共通クラス化しておかないと、

一応リストっぽい操作を持つ型構築子クラスとしてはData.Foldableってのがある。GHC 6.6で追加された。
ただ、これを使ってUTF8StringをFoldableのインスタンスにすることはできない。
なぜならUTF8Stringは型であって型構築子ではないから。
一旦type UTF8String = UTF8StringC Charみたいなものを考えて
UTF8StringCをFoldableのインスタンスにすることは出来るだろうけど、それってどうなんだろう。
970デフォルトの名無しさん:2007/03/18(日) 03:55:42
型はそれで一応解決?としても、
 : と [] は言語仕様の方に手を入れるしか。
[]は単なる糖衣としても、 : は?
971デフォルトの名無しさん:2007/03/18(日) 09:58:34
>>969
それだと、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
...
しかし、これってやるに値することなのかな。
型クラスを介して操作するなら、コストの点ではリストに変換してしまうのと大差ないような。
972デフォルトの名無しさん:2007/03/18(日) 10:24:52
うん、そういう変なのが作れちゃうからどうなんだろうって思った。

> class List container element | container -> element where
関数従属って全然使ったことないから思いつかなかったな。
973デフォルトの名無しさん:2007/03/18(日) 11:47:29
これはとんだコードは簡潔だけど記述するのに30倍くらい時間のかかる糞言語ですね
974デフォルトの名無しさん:2007/03/18(日) 11:54:27
>>973
どういうコードを書いているかにもよるが、Haskellじゃなくて
お前が糞である可能性も十分にあると思う。
特に、コードが簡潔なのに書くのに時間がかかる場合、
不慣れなだけな可能性が高いかと。
975デフォルトの名無しさん:2007/03/18(日) 12:06:33
馬鹿を寄せ付けない言語として最強
馬鹿はJavaでもやってろwwwwww
976デフォルトの名無しさん:2007/03/18(日) 14:36:27
>>971
>型クラスを介して操作するなら、コストの点ではリストに変換してしまうのと大差ないような。

Stringableも型クラスじゃん。違うの?
どうせ型クラスなら、分断と混乱を防いだ方が良いと思うけど。
977デフォルトの名無しさん:2007/03/18(日) 15:21:01
デフォルト定義をそのまま使うならコストがかかるかも知れないけど、
それぞれの型に最適化した定義で上書きできるからあんまり問題ないと思う。
978デフォルトの名無しさん:2007/03/18(日) 15:58:03
>>976
>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クラスは共存できる。
こういう風に、クラスは後付けでもなんとかなるのが特徴だと思う。
979デフォルトの名無しさん:2007/03/18(日) 16:00:09
関数の動的バインディングのコストを言ってるんじゃないの?
HaskellというかGHC?で、この辺どうなのか全然知らないけど。
まあ、Stringableも型クラスなら変わらないから関係ないと思うけど。

誰か、>>971を連中に提案してくれよ。
Stringable should be "List', othewise it shall bring about a civil war in Haskell applications.
みたいな。


でも、>>971じゃ、[] 記法や : でのマッチが解決しないな。
これをStringableでも使えるようにしないとあかんな。
980デフォルトの名無しさん:2007/03/18(日) 16:05:02
リストとして扱えないだけで嫌なんだけど
981デフォルトの名無しさん:2007/03/18(日) 16:09:42
>>>978
解説ありがとう。

>こういう風に、クラスは後付けでもなんとかなるのが特徴だと思う。

なるほど。急ぐ必要はないのか。
でも最初というか早い内からあった方が良いよね?共通クラス。

あと、リストの場合は型の問題(≒関数・演算子の問題)の他、
[]記法と : のマッチの問題があるんじゃない?

それもListクラス導入時に同時に解決すべき問題で急ぐ必要はないのかも知れないけど。
982デフォルトの名無しさん:2007/03/18(日) 16:10:27
>>980
何を批判しているのか明確にしてくれ。
リストを使うのを妨げるような変更は一切話題になっていないと思うんだが。
983デフォルトの名無しさん:2007/03/18(日) 16:11:53
>>982
>>981
> []記法と : のマッチ
をStringableでも使いたいと言うことでは?
984デフォルトの名無しさん:2007/03/18(日) 16:19:03
hoge (x:xs) = fuga x : hoge xs
をStringableでもやりたいって事かと。
実際、リスト処理はこれで書かれてると思うし。

ただ、[]は不要かな?新規にデータ構築する時だけだし、
文字列処理ではあんま使わないかも?リストが出来るだけで問題ないかも。
985デフォルトの名無しさん:2007/03/18(日) 16:31:37
(:)と[]を変えるなら言語に手を入れなきゃならんからな。
>>971みたいなのを導入するならコードの書き換えが前提だと思ってたが。
986デフォルトの名無しさん:2007/03/18(日) 16:35:29
屁理屈をこねだす初心者は
学習が全然進まない、という好例だな。
987デフォルトの名無しさん: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
988デフォルトの名無しさん:2007/03/18(日) 16:45:11
間違えた。
hoge = foldr (\x y -> cons (fuga x) y) empty
じゃないと型が合わない(^^;
989デフォルトの名無しさん:2007/03/18(日) 16:51:08
hoge (x:xs) = fuga x : hoge xs
は、
データ構造の実装を直接触る、汚い・忌むべきコードなんだよ!
hoge xs = cons (fuga.head xs) $ hoge.tail xs
みたいにちゃんと関数で書くべきなんだ!!

もちろん、
bar Just a  = foo a
bar Nothing = baz
もダメダメだ!!!
990デフォルトの名無しさん:2007/03/18(日) 16:58:30
それじゃ結局分断は避けられないじゃん。
それとも、>>989みたいな考え方を浸透させて、
hoge (x:xs) = fuga x : hoge xs
みたいのは非推奨にするの?言語として良い解なのかな、それ?
991デフォルトの名無しさん:2007/03/18(日) 17:10:46
Haskellの特長であるパターンマッチングを捨てるのか。
MLに敗北するのか。
992デフォルトの名無しさん:2007/03/18(日) 17:32:19
敗北厨かよ・・・
993デフォルトの名無しさん:2007/03/18(日) 18:01:48
今のHaskellの仕様だとどんなに型クラスとかをいじくりまくってもUTF8Stringをx:xsにパターンマッチさせることは出来ない。
仕様自体を変更しないと無理。
994デフォルトの名無しさん
あちゃー
もう文字列をリストで表現できるとか他言語に自慢できないのね