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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/10/25(金) 21:54:29.92
関数型プログラミング言語 Haskellについて語るスレです。

前スレ: 関数型プログラミング言語Haskell Part23
http://toro.2ch.net/test/read.cgi/tech/1376111807/

haskell.org
http://www.haskell.org/

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

過去ログ (10〜)
Part21 ttp://toro.2ch.net/test/read.cgi/tech/1358702176/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
0002デフォルトの名無しさん2013/10/25(金) 21:55:57.09
               ノ      ゚.ノヽ  , /}      ...
            ,,イ`"     、-'   `;_' '    ..::::::::::::::...
   ,-、  _.._   (        (,(~ヽ'~     ..:::::::::::::::::::::::
 )'~  レー'  〉   ヽ       i`'}       .:::::::::::::::::::::::
 ~つ     '-ー、  i       | i'     ...:::::::::::::::::::::::
 /       <  /     。/   !  ......:::::::::::::::::::::::::    これは>>1乙じゃなくて
/         ~^´     /},-'' ,●::::::::::::::::::::::::::::::::::::
i、        ,i' _,,...,-‐-、/    i  ::::::::  .:::::::::::::
..ゝ        <,,-==、   ,,-,/      .:::::::::::            放射能がうんたら
 )       {~''~>`v-''`ー゙`'~       ..:::::::::                          ........::.
 {        レ_ノ            ..::::::::.                         ......:::::::::
ノ         ''           ..:::::::                        ...::.:...:::::::::
                     .:::::::::                     ...:......:::::::::::: .
                    .:::::::::::.        .....      ..  ..::::::::::::::::::::::::   :::.
                    ::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. ::  ::..
                    .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::    ::.
                    ::::::::::::::::: :::::::::::::::::::::::::::::: :::::
                          .::    ::.  :::
0003デフォルトの名無しさん2013/10/25(金) 21:57:45.35
過去ログ (20〜)
Part23 http://toro.2ch.net/test/read.cgi/tech/1376111807/
Part22 http://toro.2ch.net/test/read.cgi/tech/1364009659/
Part21 ttp://toro.2ch.net/test/read.cgi/tech/1358702176/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
0004デフォルトの名無しさん2013/10/26(土) 03:58:23.29
C++の限界
http://www.digitaltrends.com/wp-content/uploads/2013/02/gtav.jpg

C#の限界
http://www.stfuandplay.com/images/uploads/GunsIO-TOP.jpg

Haskellの限界
http://www.haskell.org/wikiupload/c/c2/Frag1.png
0005デフォルトの名無しさん2013/10/26(土) 19:26:01.37
最高
0006デフォルトの名無しさん2013/10/26(土) 21:50:44.57
Haskellのコスパのいい勉強順序とは?
0007デフォルトの名無しさん2013/10/26(土) 21:56:56.30
C++←自転車
C#←空中戦艦
Haskell←ソルジャー

C++が最弱!ありえん!なんで自転車!
0008デフォルトの名無しさん2013/10/26(土) 22:32:02.64
>>6
他の言語と同じだよ。

1. まず Hello World 含むトイプログラムを何十個と書いては実行し、
主な文法や機能を身に付ける。

2. 次にそれらのプログラムの実行がなぜ意図した結果になるのか、
中でどのような処理が行われているのか、その意味を理解する。
ただし、Haskell の場合は C や Java などと違ってここが難解なので、
具体的にコンパイラがどのようなコードを吐くかまでは理解しなくてもよい。
もっと抽象的に、プログラムを順に弱頭部正規形に簡約して評価していく様子が
頭に思い浮かべることができれば十分。

3. 何か小さなアプリをいくつか作り上げてみる(完成させるのがポイント)。
linux の echo コマンドや cat コマンドの簡易版でも良い。
完成したら、いくつか機能を付け加えてみる。

4. いくつか作ってみるうちに、ボイラープレートを何とかしたいなとか、
もっと簡単に機能を加える方法はないものかとか、
なんかプログラムが汚くてかっこ悪いなとか、いろいろ思うところが出てくる。
そうしたら、他人のコードを見たり、BBSで質問したり、
問題を解決してくれそうなライブラリを探したりすればいい。

実際はこんな綺麗にステップアップ式に学べるものではなく、
おそらく 2 3 4 を行ったり来たりすることになるが、
概ねこのような順で学ぶといいのではないか。

コストを時間と捉えるなら、私はこの順を勧める。
0009デフォルトの名無しさん2013/10/26(土) 22:53:59.43
プログラマは頭なんてよくないよ
一種のサバン症候群だから日本語は苦手
0010デフォルトの名無しさん2013/10/26(土) 23:07:12.23
>>8
これはありがたい
0011デフォルトの名無しさん2013/10/27(日) 01:47:21.69
ネット上で日本語の質の良い入門サイト教えてほしい
0012デフォルトの名無しさん2013/10/27(日) 03:31:14.01
gentle introductionの日本語訳
0013デフォルトの名無しさん2013/10/27(日) 05:04:16.17
サンプル見ながらでしか書けない人っているよね
0014デフォルトの名無しさん2013/10/27(日) 05:05:09.54
文字列を出力して改行する = putStrLn
こんにちは、世界 = 文字列を出力して改行する "こんにちは、世界"
0015デフォルトの名無しさん2013/10/27(日) 07:28:10.87
SL4A で動きますか?
0016デフォルトの名無しさん2013/10/27(日) 08:23:51.44
>>14
へー(、)という演算子が定義できるのか
0017デフォルトの名無しさん2013/10/27(日) 08:39:05.13
冗談抜きでプログラムさくさく書けるひと尊敬するわ
コミュ障が多いけど
0018デフォルトの名無しさん2013/10/27(日) 11:21:51.69
今時プログラムをさくさく書けないって古い地球人過ぎないか
0019デフォルトの名無しさん2013/10/27(日) 11:55:53.91
マルチポストに反応する新しい地球人
0020デフォルトの名無しさん2013/10/27(日) 12:02:52.38
>>13
関数マニュアル見ただけでかけるほどマニュアルはちゃんとかけてないし、
そもそも関数自体がそんな風にできてない
とすればどういう使い方を想定して関数があるのかをサンプル見て知るしかない
0021デフォルトの名無しさん2013/10/27(日) 13:11:39.80
>>12
これのこと?
ttp://www.sampou.org/haskell/tutorial-j/index.html
結構古いけどhaskell98って今のhaskellと違う部分とか無いのかな
0022デフォルトの名無しさん2013/10/27(日) 13:49:51.27
そんなに変わってない。基本的に高度な機能は言語拡張(処理系依存)でカバーするから
http://www.haskell.org/haskellwiki/Haskell_2010#Changes_since_Haskell_.2798
0023デフォルトの名無しさん2013/10/27(日) 15:22:18.34
じゃあ大丈夫か
でもやっぱりそのサイトの日本語分かりづらかったから本買おうかな
Lispから本格的にHaskellに入信しようか迷う
0024デフォルトの名無しさん2013/10/28(月) 02:49:05.04
Haswell の GUI は何がメジャーですか
0025デフォルトの名無しさん2013/10/28(月) 10:14:58.65
gtk+とwxHaskellかな
qtもあるけど長いこと更新されてないと思う
0026デフォルトの名無しさん2013/10/28(月) 14:33:22.79
節子それHaswellちゃう
0027デフォルトの名無しさん2013/10/29(火) 02:23:58.08
通はHaskell+GLUT
0028デフォルトの名無しさん2013/10/29(火) 07:39:36.24
http://www.haskell.org/haskellwiki/X_window_programming_in_Haskell
Xサーバでも、Xqartz、Xmingで動けばいちおうクロスプラットフォームになるのか。
0029デフォルトの名無しさん2013/10/29(火) 07:54:11.48
よくかんがえてみたらJavaの実行環境もそんなもんだったな
インストーラ作ってハードル下げればクロスプラットフォームになるんじゃ
0030デフォルトの名無しさん2013/10/29(火) 10:16:35.03
>>27
いや、Haskell+GLFWだね
0031デフォルトの名無しさん2013/10/29(火) 15:02:10.03
Win32APIで勉強してる
0032デフォルトの名無しさん2013/10/29(火) 15:25:23.97
結局よくあるプログラムには向いてないんだよね?
そういうのも綺麗にシャレオツに書ける言語ないかな。
0033宇宙人2013/10/29(火) 16:44:31.44
>>32
地球には今のところ無いが、地球の科学技術レベルはまんざらでもなく10年後くらいにはあるかも。
0034デフォルトの名無しさん2013/10/29(火) 17:47:43.20
お、おう
0035デフォルトの名無しさん2013/10/29(火) 17:51:23.93
プログラムを作ることに向かないプログラミング言語Haskell
0036デフォルトの名無しさん2013/10/29(火) 21:06:32.89
でも論文採択率は良さそう...
0037デフォルトの名無しさん2013/10/30(水) 00:49:38.58
WindowsやAndroidでも普通に動けばな
0038デフォルトの名無しさん2013/10/30(水) 00:50:18.81
F#でいいんじゃねぇの
0039デフォルトの名無しさん2013/10/30(水) 01:29:12.39
逆に関数型で生まれた概念が他の言語に入れば満足だ
純粋関数だけでどうせプログラム組めないし
0040デフォルトの名無しさん2013/10/30(水) 02:00:26.33
>>39
一番成功している関数型言語がC言語というオチ
0041デフォルトの名無しさん2013/10/30(水) 06:50:46.69
Cが関数型言語ってどういうこと
プリプロセッサで頑張る話?
0042デフォルトの名無しさん2013/10/30(水) 07:08:58.55
手続き型言語が体に馴染んでいるならそれ使ってればいいじゃん?って思うんだけど
Haskellが第一言語の俺達とは相容れない運命なのさ…
0043デフォルトの名無しさん2013/10/30(水) 09:04:47.62
pascalが手続き型でcが関数型だと勘違いしてた時期が俺にもありましたw
0044デフォルトの名無しさん2013/10/30(水) 09:36:55.63
>>41
別にプリプロセッサだけで頑張る必要ないだろ。
純粋性を保つようにコードを書けばいいんじゃね?
0045デフォルトの名無しさん2013/10/30(水) 12:31:19.74
>>44
あいや、Cで関数型と聞いて思い当たったのがプリプロセッサを純粋関数型言語として使うという話しかなかったので
Cの #define を駆使するとプリプロセッサだけで案外ちゃんと計算ができるんだけど、代入が表現できないので純粋関数型言語の作法で書かざるを得ないというネタ(思い出してみたらネタだったけど煽る意図ではなかった)
0046デフォルトの名無しさん2013/10/30(水) 12:31:45.13
>>44
保証がない
0047デフォルトの名無しさん2013/10/30(水) 12:39:29.52
昔から一応functionalヘッダ持ってたり最近ラムダ式とか仕様に入れだしたC++を挙げるならまだしもなぜわざわざCを
0048デフォルトの名無しさん2013/10/30(水) 12:40:37.22
Haskell の解説を見ると呪文のようにループは再帰があればって書いてあるけど
本当はループ欲しいんじゃないの?
0049デフォルトの名無しさん2013/10/30(水) 13:20:22.69
>>46
unsafePerformIOだって保証ないじゃん
0050デフォルトの名無しさん2013/10/30(水) 19:04:39.77
>>49
無理に穴を見つけようとしないで、もっと気楽に素直になれ
0051デフォルトの名無しさん2013/10/30(水) 19:29:28.28
>>48
心の底から要らない。あっても使わない
0052デフォルトの名無しさん2013/10/30(水) 19:50:42.76
>>48
ループはいらんかもね。
俺は再帰よりもmapとかを多用するようになった。
0053デフォルトの名無しさん2013/10/30(水) 20:12:40.70
caseいらないとかも同じで
最初から完璧な最終的なコード書けるならいいけど
実験的なコード書いてるときはどうしてもゆるい書き方が欲しくなるのだよ
0054デフォルトの名無しさん2013/10/30(水) 20:24:55.77
xml-conduit モジュールの Text.XML.Cursor.content や attribute などは
戻り値として text モジュールの Data.Text.Internal.Text 型のリストを返します。

このリストの要素に対して text モジュールの Data.Text.unpack 関数を適用すると
String 型の値が返ってきます。

しかし、なぜ Data.Text.Internal.Text 型の値に
Data.Text.unpack 関数が使えるのでしょうか。

Data.Text.unpack :: Text -> String の第1引数の型は
Data.Text.Text であって、Data.Text.Internal.Text ではないにも関わらず、です。
0055デフォルトの名無しさん2013/10/30(水) 20:30:34.85
>>54
コンパイラーさんがいいと言ってるんだから、細けぇことはいいんだよ!
0056デフォルトの名無しさん2013/10/30(水) 23:20:41.33
再帰はスタックを馬鹿食いするから多用すべきではない
0057542013/10/30(水) 23:50:04.37
>>55
真面目にお願いします
0058デフォルトの名無しさん2013/10/30(水) 23:53:13.23
>>54
名前空間が違うだけで、型は同じ。
0059デフォルトの名無しさん2013/10/30(水) 23:54:53.51
>>56
List->Listなら、再起でもスタック消費しない。
それ以外は基本、末尾再帰。
0060デフォルトの名無しさん2013/10/31(木) 00:08:02.05
>>57
http://hackage.haskell.org/package/text-0.11.3.1/docs/src/Data-Text.html
0061デフォルトの名無しさん2013/10/31(木) 17:03:37.76
Egisonの話題ってここで良いの?
0062デフォルトの名無しさん2013/10/31(木) 19:51:29.64
ダメだろ
0063デフォルトの名無しさん2013/10/31(木) 20:11:50.44
どこですればいい?
0064デフォルトの名無しさん2013/10/31(木) 20:37:46.69
>>63
こちらで
http://toro.2ch.net/test/read.cgi/tech/1383219359/
0065デフォルトの名無しさん2013/10/31(木) 20:42:14.31
おっ サンキュー
0066542013/11/01(金) 07:51:27.23
>>58
>>60

「名前空間が違うだけで、型は同じ」 そういうことなんですね。

でも、どうしてわざわざ Internal の方の名前空間を使うのでしょうか。

"Internal" というモジュールは他のライブラリでもありますが、
基本的にはより低レベルの内部的な処理のためのものだと思います。
ライブラリを利用する側の者が使うのはあまり好ましいことではないような気がしますが、
Data.Text.Internal の説明には

Modules which extend the Text system may need to use this module.

とあるように、むしろ Data.Text ではなくこちらを使うよう促していますよね。
なぜなんでしょうか?
0067デフォルトの名無しさん2013/11/01(金) 09:24:55.23
>>66
それ以上は言語とは関係ないライブラリ固有の話題だからドキュメント調べろよ
0068デフォルトの名無しさん2013/11/01(金) 09:47:45.58
>>66
>Modules which extend the Text system
ってライブラリを拡張する場合だから、ただの利用者じゃないでしょ。
0069デフォルトの名無しさん2013/11/01(金) 10:16:27.59
>>68
その上、その後ろに、こう書いてあるしな。

You should not use this module unless you are determined to monkey
with the internals, as the functions here do just about nothing to preserve
data invariants. You have been warned!

そもそも、>>54の前提がおかしい。

>xml-conduit モジュールの Text.XML.Cursor.content や attribute などは
>戻り値として text モジュールの Data.Text.Internal.Text 型のリストを返します。

ソースを見るとこうなってる。
http://hackage.haskell.org/package/xml-conduit-1.1.0.7/docs/src/Text-XML-Cursor.html#content

import qualified Data.Text as T
content :: Cursor -> [T.Text]
0070542013/11/01(金) 12:52:36.75
>>69
ghci の :t コマンドで型情報を調べたのですが、
どうも、現在どのモジュールを読み込んでいるのかによって
:t コマンドの結果が違うようです。

ghci を立ち上げた直後に :m + Text.XML.Cursor として
モジュールを読み込んだ状態だと、次のようになりました。

Prelude Text.XML.Cursor> :t content
content :: Cursor -> [Data.Text.Internal.Text]

Data.Text モジュールも一緒に読み込むと次のようになりました。

Prelude Text.XML.Cursor Data.Text> :t content
content :: Cursor -> [Text]

:l で読み込んだ自作のモジュール内に import Data.Text (Text) という記述があっても、
:t で型を調べるときは上記のように「何を :m で読み込んでいるか」によって結果が変わるみたいです。

私は ghci 上の Prelude Text.XML.Cursor> の状態で調べていたようです。

本当の型を調べるには :t は役立たず、ソースを読まなければならないということでしょうか。


環境
ghc 7.6.3
0071デフォルトの名無しさん2013/11/01(金) 14:11:44.51
te
0072デフォルトの名無しさん2013/11/01(金) 14:30:43.39
>>70
牛丼屋に入って調理場に向かって”並・たまご”と言うか、
カウンターで注文取りにきた人に”牛丼並盛・たまご1つ”
と言うかの違い。

基本的には出てくるものは同じだが、掟破りの注文方法がずっと通用する
保証はどこにもない。
0073デフォルトの名無しさん2013/11/01(金) 16:53:11.20
t
0074542013/11/01(金) 17:57:01.12
>>72
今回の件で言えば、どれのことを「掟破り」と喩えているのでしょうか。

Data.Text.Internal.Text 型を使うのが掟破りで、
Data.Text.Text 型を使うのが通常の方法という意味でしょうか。
それだと、やはり ghci の :t では掟破りかどうかを判断できないということでしょうか。

それとも、型を調べるのにソースを参照するのが掟破りで、
ghci の :t を使うのが通常の方法ということでしょうか。
それだと今回のように正しい判断ができなくなります。
0075デフォルトの名無しさん2013/11/01(金) 18:10:20.33
>>74
型を調べる正しい方法はドキュメントやソースを読むことであって、
:t を使うのは調理場の中に入って自分でご飯をよそうようなことだと思うけど。
0076デフォルトの名無しさん2013/11/01(金) 18:27:57.28
ドキュメントはともかくソースを読んじゃダメでしょ
内部実装はいつ変更されても文句言えない
0077デフォルトの名無しさん2013/11/01(金) 18:38:30.23
:tを使うのは食べログみる感じじゃない?
食べログで確認したとおりに二郎で注文したのに「うちはマシマシ禁止です」って
怒られたことがある
0078デフォルトの名無しさん2013/11/01(金) 18:39:25.32
・モジュールは、別のモジュールからインポートした型や関数を再エクスポートできる
・Data.Textは、Data.Text.Internalで定義されたTextという型を再エクスポートしている
・再エクスポートしても実体は一つ。同じ型
・textパッケージの作者から見ると、TextがInternalで定義されているというのは実装の詳細で、
 普通の利用者にはData.Textからインポートして欲しいと思っている
・ghciから見ると、作者の意図など知ったこっちゃないので、:tでは
 Textが実際に定義されているInternalモジュールを提示する
0079デフォルトの名無しさん2013/11/01(金) 18:53:41.07
C言語のヘッダファイルのような、モジュールの公開情報を知る方法ってないの?
型の定義とか、関数の型とか。
ドキュメントは古かったり間違ってたりするよね。ってのは偏見かなぁ。
0080デフォルトの名無しさん2013/11/01(金) 18:54:58.27
下手くそな比喩やめろ
0081デフォルトの名無しさん2013/11/01(金) 19:01:34.11
まだハスケルってあったの?
もうとっくに消えたかと思った。
C言語が流行ったときのパスカルみたいな存在だよねw
0082デフォルトの名無しさん2013/11/01(金) 19:04:07.57
連続して訳の分からない比喩が
0083542013/11/01(金) 19:07:11.31
>>76
たとえば Text.XML.Cursor モジュールのドキュメントの content :: Cursor -> [Text] の項を見ると、
Text のリンクは Data.Text.Text ではなく、Data.Text.Internal.Text へ飛びます。

それが本当は Data.Text.Text を指していることは、今回ソースを読んだ >>69 の指摘でわかりました。

やはり型を知るにはソースを読まないといけないのが現状だと今回の件で認識しました。

それとも、もしかしてドキュメントのリンクがこのようになっているのは私だけでしょうか。
たとえば、ライブラリ(ドキュメント)のインストール順序によってはリンクがおかしくなるとか・・・
0084デフォルトの名無しさん2013/11/01(金) 19:34:26.81
>>74
>Data.Text.Internal.Text 型を使うのが掟破りで、
>Data.Text.Text 型を使うのが通常の方法という意味でしょうか。

そういうこと。Text.XML.Cursor.contentも、そうしてる。

ghciは自分の知ってる型の中から合致するものを報告するだけ。
(xml-conduit モジュールの作者の意図とは無関係)

>>83
もしかして、Data.Text.Internal.TextとData.Text.Textが違うものだと
思ってる?

本体はData.Text.Internal.Textに定義してあって、Data.Text.Textは
そのリンクだと思えば良いよ。
でも、ライブラリ作者がユーザーに使ってもらいたいのはリンク(Data.Text.Text)の方。

ghciは空気読めないから、その作者の意図に反して本体を示すことがある。
haddocで自動生成されるドキュメントも同じこと。
0085デフォルトの名無しさん2013/11/01(金) 19:39:14.03
>>83
>やはり型を知るにはソースを読まないといけないのが現状だと今回の件で認識しました。

極論を言えば、そういう場合もあるけど、今回の場合は”.Internal.”をみて、ユーザが
作者の意図を察してあげるのがプログラマ社会のルールだと思う。
0086デフォルトの名無しさん2013/11/01(金) 19:43:32.97
>>79
haddockドキュメントの中でで、英語で書いてある部分は全部無視して型情報だけ見ればいい
そこは自動生成なので古くならない
0087542013/11/01(金) 21:15:01.08
>>84
> もしかして、Data.Text.Internal.TextとData.Text.Textが違うものだと
> 思ってる?

初めはそう思っていましたが、皆さんの指摘を受けて同じものだと知りました。

>>66 の時点で同じものだと知りましたが、ghci の :t を疑わなかったので、
同じ物のうちで TextとData.Text ではなく Data.Text.Internal の方を公開している
という勘違いをずっとしていました。
その勘違いも理解できました。

> 今回の場合は”.Internal.”をみて、ユーザが
> 作者の意図を察してあげるのがプログラマ社会のルールだと思う。

それなら仕方ありません。
私もそのように従うことにします。

みなさんアドバイスありがとうございました。
0088デフォルトの名無しさん2013/11/01(金) 22:33:25.63
Haskellにはモジュール化設計や抽象データ型といった
モダンな大規模開発向け機能が欠落しているのかね?

モジュール化設計機能を備えた言語であれば、
モジュールの外部仕様(interface)と実現方法(implement)を
分離できるから、ツール類で実装向けデータ構造と
ユーザ提供向けデータ構造を正しく認識できるから、
>>87みたいな:tコマンドやhaddockでの誤認識は起こりえない

また、抽象データ型機能を備えた言語であれば、
内部の実装向けデータ構造をユーザから完全に隠蔽できるから、
Data.Text.Internalみたいな実装向けデータ構造が
外部から見えてしまうという根本の問題が生じ得ない

Haskellは関数型言語研究の最新の成果を反映した先端言語という
ふれこみであるけれど、(結局は数学者/研究者向けの言語だから、)
ソフトウェア工学において大規模開発では必須と認められている
これらの機構が完全に無視されてているように見える

結論として、Haskellは研究や試作といった用途には適しているのかも
しれないけど、大規模開発&保守性を要求される産業界での
実用的な開発には不適格な言語ではないのかと考える
0089デフォルトの名無しさん2013/11/01(金) 22:42:07.77
>>88
日本語が変だったので、以下の段落を書き直す

>モジュール化設計機能を備えた言語であれば、
.... 中略 ....、
>>>87みたいな:tコマンドやhaddockでの誤認識は起こりえない


モジュール化設計機能を備えた言語であれば、
モジュールの外部仕様(interface)と実現方法(implement)を
分離できるから、ツール類でも実装向けデータ構造と
ユーザ提供向けデータ構造を正しく認識できるはず
(もしできないのであれば、ツールのバグか機能不十分と見なすべき)
結果として、>>87みたいな:tコマンドやhaddockでの誤認識は起こりえない
0090デフォルトの名無しさん2013/11/01(金) 23:14:33.52
あえてオブジェクト指向という言葉を避けているように見受けるが何かあるのか?
0091デフォルトの名無しさん2013/11/01(金) 23:20:37.34
Haskellはデータとプロシージャが分離してる
0092デフォルトの名無しさん2013/11/01(金) 23:30:10.81
インターフェースも実装も実体も同じ物2つをさして
見分けられないからモジュール性に優れてないってめちゃくちゃ言ってるな
単なるghcの不具合ってだけだろ
0093デフォルトの名無しさん2013/11/01(金) 23:36:58.05
>>88
>分離できるから、ツール類で実装向けデータ構造と
>ユーザ提供向けデータ構造を正しく認識できるから、
今回の例ではデータ構造は一つだからこれは当たらない

>また、抽象データ型機能を備えた言語であれば、
>内部の実装向けデータ構造をユーザから完全に隠蔽できるから、
もちろんHaskellでもこれはできる。でもtextパッケージはあえてやってない
一部の用途ではどうしても内部実装に踏み込みたいことがある
そういう場合に、実装を完全に隠蔽していたら、せいぜいソースをコピーして
パッチを当てるしか道がない
それよりは、「特殊用途向け」に.Internalモジュールを公開して、その代わり
これは内部実装だからマイナーバージョンアップで壊れるかもしれないよ、
気軽に使うなよ、と宣言しておくのがまだマシだという思想
0094デフォルトの名無しさん2013/11/01(金) 23:41:17.02
慣れれば一瞬でループを再帰に置き換えられるもんなの?
0095デフォルトの名無しさん2013/11/01(金) 23:41:53.15
>>90
モジュール化と抽象データの概念がソフトウェア工学研究の成果として
認知されたのが1970年代後半から1980年代
この頃に設計された Modula, Mesa, Ada といった言語には、これらの機能が備わっている
オブジェクト指向の概念が登場したのは、その後になる

つまり、オブジェクト指向という言葉を持ち出さずとも論証できるから、
というのが第一の理由


また静的型付け関数型言語である Standard ML(SML) は
オブジェクト指向の機構を一切持たない古い設計であるが、
完全なモジュール化と抽象データの仕組みを備えているから、
>>88,89の問題はどのSML処理系を利用していても現実に起きたことがない

つまり、SMLでも問題が生じないのだからオブジェクト指向とHaskellの問題は無関係
これが、オブジェクト指向という言葉を持ち出さない第二の理由
0096デフォルトの名無しさん2013/11/01(金) 23:43:10.97
>>94
効率を考えないなら書き換え自体は別に難しくないだろ
関わる変数を全て引数にするだけだし
0097デフォルトの名無しさん2013/11/01(金) 23:45:35.24
あと
>ソフトウェア工学において大規模開発では必須と認められている
>これらの機構が完全に無視されてているように見える
こういう明かな間違いを平気な顔で言うのは恥ずかしいから、
今後は入門書の一冊でも読んでから批判するのが良いと思う
0098デフォルトの名無しさん2013/11/01(金) 23:45:57.88
20年にわたるオブジェクト指向の実験は失敗に終わった
従来の構造化プログラミングと1980年代のsmalltalkからのアドバンテージがなかった
0099デフォルトの名無しさん2013/11/02(土) 00:01:44.35
>>92
どこにghcの不具合があるのか
ghcは正しくはどうするべきだったと思う?
0100デフォルトの名無しさん2013/11/02(土) 00:08:16.38
>>93
>今回の例ではデータ構造は一つだからこれは当たらない

>>93の後段では「一般用途向け(Data.Text.Text)」と
「特殊用途向け(Data.Text.Internal.Text)」という
二種類のデータ構造を提供していると書いてあるように読めるから、
矛盾していないかな?


>それよりは、「特殊用途向け」に.Internalモジュールを公開して、その代わり
>これは内部実装だからマイナーバージョンアップで壊れるかもしれないよ、
>気軽に使うなよ、と宣言しておくのがまだマシだという思想

こういったレイヤの異なる二種類のインターフェイスを提供するという考え方(思想)は、
決して間違いではないとは思う
ただし、SMLを含むモダンな言語のモジュール化機構では、
アプリケーション側で用途に応じて必要なモジュールだけをimportできる仕組みが、
言語仕様の一部として提供されている
結局、このレス(>>93)では、まともなモジュール化機構を持たないHaskellが
(形式的な理論ではなく)コード設計技法という小手先のテクニックで
モジュール化機能を模倣している、という説明にしかならない

これは、モジュール化機構を持たないJavaScriptが、コード設計技法と規約によって
モジュール化の基本である階層的名前空間を実現している実情と、よく似ている
そして、モジュール化機能がツールで支援できない点もHaskellと同様だ
0101デフォルトの名無しさん2013/11/02(土) 00:09:53.81
Haskellは静的型付けだからコンパイルできればおk
例外が出たときは書いた奴が悪い
GHCは何も悪くない
■ このスレッドは過去ログ倉庫に格納されています