関数型プログラミング言語Haskell Part18at TECH
関数型プログラミング言語Haskell Part18 - 暇つぶし2ch1:デフォルトの名無しさん
12/03/16 21:54:23.92
haskell.org
URLリンク(www.haskell.org)

日本語サイト
URLリンク(www.sampou.org)
URLリンク(www.shido.info)

過去ログ
関数型プログラミング言語Haskell
Part1 URLリンク(pc.2ch.net)
Part2 スレリンク(tech板)
Part3 スレリンク(tech板)
Part4 スレリンク(tech板)
Part5 スレリンク(tech板)
Part6 スレリンク(tech板)
Part7 スレリンク(tech板)
Part8 スレリンク(tech板)
Part9 スレリンク(tech板)
Part10 スレリンク(tech板)
Part11 スレリンク(tech板)
Part12 スレリンク(tech板)
Part13 スレリンク(tech板)
Part14 スレリンク(tech板)
Part15 スレリンク(tech板)
Part16 スレリンク(tech板)
Part17 スレリンク(tech板)

2:デフォルトの名無しさん
12/03/16 21:54:40.15
関連書籍
・Introduction to Functional Programming Using Haskell (2nd ed.)
 URLリンク(www.amazon.co.jp)

・Haskell: The Craft of Functional Programming
 URLリンク(www.amazon.co.jp)

・The Fun of Programming
 URLリンク(www.amazon.co.jp)

・The Haskell School of Expression: Learning Functional Programming Through Multimedia
 URLリンク(www.amazon.co.jp)

・入門Haskell
 URLリンク(www.amazon.co.jp)

・ふつうのHaskellプログラミング
 URLリンク(item.rakuten.co.jp)

・Programming in Haskell
 URLリンク(www.amazon.co.jp)

・Real World Haskell
 URLリンク(www.amazon.co.jp)

・関数プログラミングの楽しみ
 URLリンク(www.amazon.co.jp)

3:デフォルトの名無しさん
12/03/16 21:55:18.42
関連リンク
・GHC Wiki
 URLリンク(hackage.haskell.org)

・A History of Haskell
 URLリンク(research.microsoft.com)

・関数型関連の用語集
 URLリンク(sky.zero.ad.jp)

・本物のプログラマはHaskellを使う
 URLリンク(itpro.nikkeibp.co.jp)

・Haskell API search Engine
URLリンク(www.haskell.org)

・Real World Haskell
URLリンク(book.realworldhaskell.org)

・Learn You a Haskell for Great Good!
URLリンク(learnyouahaskell.com)

【簡単な使い方】
1.検索バーに関数名を入れて検索
 例 map
2.検索バーに型名を入れて検索
 例 (a -> b) -> [a] -> [b]

4:デフォルトの名無しさん
12/03/16 21:55:48.46
関連書籍 つづき

・Haskell: The Craft of Functional Programming (3rd ed.)
URLリンク(www.haskellcraft.com)
URLリンク(www.amazon.co.jp)

・Learn You a Haskell for Great Good!
URLリンク(learnyouahaskell.com)
URLリンク(www.amazon.co.jp)

5:デフォルトの名無しさん
12/03/16 23:38:20.95


6:デフォルトの名無しさん
12/03/17 02:19:03.09
HTTPサーバアプリケーションって、yesod が主流になるのでしょうか?
Mightyってのがあった気がするんですが、廃れたのでしょうか


7:デフォルトの名無しさん
12/03/17 15:47:42.83
HTTPサーバとか、メモリをどんどん食い尽くしてとんでもないことになる気がするんだけど、きちんとGCしてくれるのかな…

8:デフォルトの名無しさん
12/03/17 20:34:27.93
HaskellのGCってJavaの足下にも及ばないの?

9:デフォルトの名無しさん
12/03/17 20:37:20.93
Javaみたいにプロのベンダが作ってるわけじゃないしな…

10:デフォルトの名無しさん
12/03/17 22:23:40.81
GHCのGCはすごくまともに動くと思う
インクリメンタルGCとか凝ったものはないけど

11:デフォルトの名無しさん
12/03/17 23:32:54.22
>>1



12:デフォルトの名無しさん
12/03/17 23:50:09.99
>>6
よく知らんが、ちょうど今月号のWEB+DB PRESS vol.67の濃縮還元オレンジニュースって記事には、"Haskellで書かれたWebフレームワーク「Yesod」のチュートリアル"というタイトルで初心者向けのチュートリアル記事を書いたと言う記事がある
その中から引用する限りじゃ、Yesodは主要フレームワークの一つらしい

以下、記事を引用

Haskellの主要Webフレームワークには、Yesod、Happstack、Snapの3つがありますが、その中で比較的初心者が取り組みやすくコミュニティが活発なことからYesodを取り上げています。




中略



HaskellのWebフレームワークがRailsやPHPはもとよりNode.jsよりパフォーマンスに優れていることを示しています。


13:デフォルトの名無しさん
12/03/18 01:31:10.89
javaのtomcatみたいなものか…


14:デフォルトの名無しさん
12/03/18 01:51:05.93
Yesod は Hello World を見ると初めギョッとするが、
考え方を理解すると、非常に洗練されてて理にかなっていることが分かる

15:デフォルトの名無しさん
12/03/18 14:39:00.03
C 言語側で次の定義の関数 f をインポートする場合

enum EEE { EEE0, EEE1 };
void f (enum EEE x) { ... }

Haskell 側では、次のようには「できない」ですよね

data TTT = TTT0 | TTT1 deriving (Enum)
foreign import ccall "f" g :: TTT -> IO ()

これは、関数 g の引数を CInt 型にするしか無いのでしょうか

URLリンク(en.wikibooks.org)
ここに、hsc ファイルで #enum マクロを使った列挙型の例がありますが、
これも結局は CInt を Haskell 側のスタブ関数の引数にしていますよね
これって、rule gauss15 とかやらずに 100 とかリテラルを直接書いても
コンパイルは通ってしまうので、型的に安全とは言えないと思うんですよ

これは FFI で列挙型を含む外部関数を使う以上仕方のないことなのでしょうか
構造体は Storable クラスのインスタンスにすれば型的に安全に扱えるので、
列挙型も何かできるといいのですが

16:デフォルトの名無しさん
12/03/18 15:23:26.46
hsc2hsは全然使ったこと無いから解らんが、
とりあえずnewtypeにしてんだから、データコンストラクタとアクセサ(例の場合ならIntegrationRuleとrule)をエキスポートしなけりゃ、
モジュールの外ではCIntとして扱えないんだから問題なくね?

17:デフォルトの名無しさん
12/03/18 16:01:26.89
c2hsのenum defineルールを使った場合でも
toEnum 100 :: IntegrationRuleした時に実行時エラー吐くのが関の山だな


18:デフォルトの名無しさん
12/03/18 16:08:26.89
>>16
リンク先では、hsc2hs で作った Enum 型を
次のように使って C 言語側の関数に渡しています(途中省略しました)

status <- c_qag gsl_f
  (realToFrac a)
  ・・・
  (rule gauss)
  ・・・
  errorPtr

この c_qag gsl_f 関数は名前や使われ方から見て
きっとどこかで foreign import されていると思いますが、
リンク先のページにはその定義は書かれていませんね

しかし、おそらく c_qag gsl_f :: CFloat -> ・・・ -> CInt -> ・・・
のような定義だと思います(そうでなければ型エラー)

これ、c_qag gsl_f (realToFrac a) ・・・ 100 ・・・ errorPtr
のように使用しても型エラーにならずにコンパイルが通ってしまいますよね

import された実際の C 言語側の関数で、不正な値の引数を検知して、
戻り値でエラーコードを返すような定義になっていればまだ良いのですが、
そうでなければ何が起こるか分からず、危険です

Haskell 側でこの 100 というリテラルをコンパイル時にエラーとして検知できないか、
という趣旨の質問でした

19:デフォルトの名無しさん
12/03/18 16:12:59.75
>>17
そうなんです

たとえ私が >>15 で「できない」と言った方法が使えたしても、
Enum クラスのインスタンスでは toEnum 関数を使われてしまいます


やはり、こういう時こそ Template Haskell の出番ですかね

20:デフォルトの名無しさん
12/03/18 16:22:13.05
Yesod上でWordPressやEC-CUBEみたいなキラーアプリが出来るといいね
WordPressは単に便利なだけでなくて、コードが抽象化されてなくてベタな設計なのが良くも悪くもサイト制作側で受けてる
EC-CUBEはみんな泣きながらカスタマイズしてるけど、自作したら得られない決済系の実績があるから使ってる
Yesod広めたいんなら、なんでみんなPHP使うのかにヒントがあるんじゃないかな?

21:デフォルトの名無しさん
12/03/18 16:54:34.49
できるとしたら値から型、型から種の持ち上げを利用した
整数リテラルから型レベル整数、そしてそれに対応したインスタンスとしてtoEnumを定義したEnumを使うというものぐらいだな
これならばコンパイル時にS (S (S ...))のインスタンスが見つからないという旨のエラーになる筈

これはリテラルとしてハードコーディングされた(コンパイル時に決まる)整数とそれ以外を区別するということでもあるのだが
そんな機構があっても使いこなせる人は極少数にしかならんというのはC++のconstexprがいい前例となってるのであまり期待はできないな

22:デフォルトの名無しさん
12/03/18 17:05:06.11
>>18
リンク先のImports and Inclusionsの項のソース見て欲しいんだが、
エキスポートされてるのはqag関数と定数 gauss15, gauss21...だけになってるじゃない?
本体のc_qag関数とか、IntegrationRule型のデータコンストラクタとアクセサはエキスポートしてないから、外からは使えない。
って、事は(IntegrateRule 100) とかリテラル渡すようなコード書けるのはモジュールの中だけだし、
qag関数に渡ってくるのは、基本的にエキスポートした定数のウチどれかしかありえないわけよ。
だから後はモジュールのテストを十分尽くせば、>15が思ってるような不安はない、って事を言いたかった。

モジュール内でもエラーになるようにしたい、っていうのが趣旨だったならまぁちょっとずれた回答だったかもしれんが。

23:デフォルトの名無しさん
12/03/18 18:02:30.69
>>22
すいません、おっしゃってることの意味がようやく理解できました
趣旨を勘違いさせてしまったようです

私が訊きたいことは、FFI で列挙型を含む C 言語の関数を使う場合に、
関数に渡す値の範囲をその列挙型の中に限定する方法は無いか、
という事でした

なぜなら、C 言語の列挙型の値は C 言語の int 型ですが、
Haskell の foreign import の型シグネチャで CInt を使うと、
列挙型の範囲を超えた値も構文上何も問題なく渡せてしまえるからです

リンク先の記事を示したのは、hsc2hs の #enum マクロを使ったとしても、
結局のところアクセス関数が自動的に作成されるだけであって、
アクセス関数を使わなければその関数を使えない訳ではない、
だからその方法も今回の問題解決には使えない事を言いたかっただけでした


今のところ、foreign import の型シグネチャでは CInt 型を使い、
それとは別に、その関数を呼ぶだけの別名の関数を定義し、
そのシグネチャで C 言語の列挙型の値の範囲に対応したデータ型を使い、
後者の関数のみをモジュールから公開することで、
モジュールの利用者には範囲外の値が利用できないようにしています

確かに、このように余計な関数を定義しても、インライン展開されて、
実行速度上はほとんど何の問題もない筈ですが、けっこう無様です

なにか別の案はないですかという趣旨でした
とりあえず、上記の方法で我慢します

24:デフォルトの名無しさん
12/03/19 01:31:28.47
おい前スレで指定の確率分布に従うランダムジェネレータが欲しいといったら
自分で作れとか言ってきた奴
staticパッケージという素晴らしいものがあったじゃないか
全く隠してやがったな

25:デフォルトの名無しさん
12/03/19 07:09:37.10
URLリンク(www.amazon.co.jp)
せっかくこういう本もあるのだから、自作するのもいいと思うんだが

26:デフォルトの名無しさん
12/03/19 08:24:52.24
staticじゃねーstatisticsじゃねーかちくしょう

27:デフォルトの名無しさん
12/03/19 08:27:21.40
>>25
お前と違って研究費で落ちねえんだよ
高えよちくしょう

28:デフォルトの名無しさん
12/03/19 12:33:02.16
>>27
私は地元の図書館で見つけました

29:デフォルトの名無しさん
12/03/19 14:00:02.75
>>25
「この商品を買った人は」に、ちくま学芸文庫の甘利先生の本がでてきたのだが、
すごい装丁だw

30:デフォルトの名無しさん
12/03/19 15:12:03.39
>>25
こんなニッチな本を誰が買うのかと思ったら機械学習系ブログがプッシュしてました。

隠れた良書「計算機シミュレーションのための確率分布乱数生成法」を大プッシュしたい
URLリンク(d.hatena.ne.jp)
「計算機シミュレーションのための確率分布乱数生成法」でサンプリングのお勉強
URLリンク(d.hatena.ne.jp)
計算機シミュレーションのための確率分布乱数生成法を買った
URLリンク(d.hatena.ne.jp)

31:デフォルトの名無しさん
12/03/19 15:54:21.23
これがステルスマーケッティングと言うやつか

32:デフォルトの名無しさん
12/03/19 20:13:39.54
べつにステマと言われようがどうでもいいよ

こういうのに興味ある人に、こんな本もあるのかと気づいてほしくて紹介しただけだから

興味が無ければ無視してくれればいい

33:デフォルトの名無しさん
12/03/19 20:24:52.96
嫌儲厨はほっとけ

34:デフォルトの名無しさん
12/03/20 01:29:25.44
ライブラリリファレンスの右上の隠しリンク便利だな
パッケージのモジュールが3画面分割で見易くなる

35:デフォルトの名無しさん
12/03/20 10:02:14.10
隠れてねーじゃん

36:デフォルトの名無しさん
12/03/20 10:22:45.60
それよりも、フレーム表示から元に戻すリンクを教えてほしい

37:デフォルトの名無しさん
12/03/20 11:04:43.10
>>35
俺IE6なんだ。。。

38:デフォルトの名無しさん
12/03/20 11:36:20.94
IE6 ってもう葬儀を済ませたんだろ
安らかに眠らせてあげろよ

39:デフォルトの名無しさん
12/03/20 14:12:30.19
Haskelってどんな人種がどんな目的で使うの?優しく教えて

40:デフォルトの名無しさん
12/03/20 14:50:48.49
個人的には、人種という言葉自体から差別的な響きを感じて使いたくないが、
目的の方でいうと、たとえば私の仕事場では単位時間辺りの
実質的な仕事の量と質を上げるために利用している

慣れというのもあるだろうが、初めから厳密な型を意識したプログラミングは、
そうでないCなどでのプログラミングと比較して、小さくて大量の(悩ましい)バグが、
コンパイルの段階で潰しやすく、実行時にはもっとアプリに本質的なバグの発見に集中できる
型推論の機能も、間違った型の使い方をコンパイル時に指摘してくれて助かってる

また遅延評価のおかげで、一連の大きな計算において、
その計算を意味の塊を基準にして個々のモジュールに分割しやすい

主にこれら2点が実質的な仕事の量と質を上げるだろうと目論んでHaskellを使い始めたが、
目的は見事に達成されている

ちなみに、たまたま私の部署は処理時間の短縮や計算リソースの削減を
厳しく求められるアプリを作るところではないため、Haskell のデメリットは表に出にくい

41:デフォルトの名無しさん
12/03/20 14:56:30.41
Haskell -> C のトランスレータってないですかね?

42:デフォルトの名無しさん
12/03/20 14:59:57.29
>>41
GCC がそれをやってくれる

43:デフォルトの名無しさん
12/03/20 15:09:00.10
>>41
ghcのコンパイラオプションでCのコード吐けるけど?


44:42
12/03/20 15:15:36.89
すまんこ

GCC じゃなくて ghc だ

45:デフォルトの名無しさん
12/03/20 16:21:13.11
Perlで書いたコードは二度と見たくない

Haskellでコンパクトに書けたコードはまた見てみたくなる

Haskellは書くときにうんざりする

多言語は書いた後で絶望する

46:デフォルトの名無しさん
12/03/20 23:58:58.60
要素数 n のリストが一つ与えられた時、
要素番号の重複を認めない m (0 <= m <= n) 個の要素からなる組み合わせを
全て集めたリストを作るのって、効率よくエレガントにやろうとすると意外に難しいな

とくにエレガントさって、自分でなかなか納得いくものができんよね

comb :: Int -> [a] -> [[a]]

comb 3 [1,2,3,4]
==> [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2,3,4]]

47:デフォルトの名無しさん
12/03/21 00:22:47.67
SICPで見たような気がするけど気のせいか

48:デフォルトの名無しさん
12/03/21 01:26:20.30
ベタに実装したbinary counting以上簡単にはならないと思う

49:デフォルトの名無しさん
12/03/21 01:32:45.19
リストで縛るとどうあがいても遅そうだな。
要素リストは配列にぶち込んどいて、
インデックスの組み合わせ生成して列挙すんのがベターかね。

50:デフォルトの名無しさん
12/03/21 02:20:06.92
let comb n xs = if length xs == n then [xs] else concatMap (\i -> comb n $ delete i xs) xs
こういう感じ?

51:デフォルトの名無しさん
12/03/21 03:13:40.85
重複を含む配列からの組合せは?

ABBCDDDEFFGGGG
から5個選ぶ時の組合せを全て列挙せよ

みたいな

重複を許したものを吐き出してフィルターかけるのはもちろん駄目

重複が無い配列の時の組合せを応用してできるの?

52:46
12/03/21 07:31:22.42
>>51
俺が取り組んだのは、元のリストは要素の対して重複を許し、
そこから選ぶ要素番号に対しては重複を認めないタイプの問題だった

たとえば、元のリスト xs から 3 つ選ぶ場合、
[xs !! 0, xs !! 3, xs !! 8] は許されるけど、
[xs !! 0, xs !! 3, xs !! 3] は認めない

まだ取り組んではいないけど、重複を許した方が多少記述が減るんじゃないかな

53:デフォルトの名無しさん
12/03/21 09:34:51.31
AAAAAAAAAAAAAAAAA `comb` 3
だと酷いことになる

重複するリストから組合せ取り出す局面がどれほどあるか判らないけど

54:デフォルトの名無しさん
12/03/21 15:31:44.99
アナグラム作成装置として使えそうだね。


55:デフォルトの名無しさん
12/03/21 16:36:15.52
let mapcon f xs = concatMap (\i -> f $ drop i xs) [0..length xs -1]
let comb n xs ys | length ys == n = [ys] | xs == [] = [] | True = mapcon (\(z:zs) -> comb n zs $ z:ys) xs
もうあんまりエレガントとも思えないけど

56:46
12/03/21 23:06:26.29
自分で作ったのは、こんな感じ

tails' :: [a] -> [[a]]
tails' [] = []
tails' [x] = [[x]]
tails' xs = xs : tails' (tail xs)

comb1 :: [a] -> [[a]]
comb1 xs = map (:[]) xs

combN', combN :: ([a] -> [[a]]) -> [a] -> [[a]]
combN' f (x:xs) = map (x:) (f xs)
combN f xs = concatMap (combN' f) (tails' xs)

comb :: [a] -> Int -> [[a]]
comb xs n = (iterate combN comb1 !! (n-1)) xs

使用例
comb [1,2,3,4,5] 3
==>
[ [1,2,3], [1,2,4], [1,2,5], [1,3,4], [1,3,5]
, [1,4,5], [2,3,4], [2,3,5], [2,4,5], [3,4,5] ]

n重ループを分解した感じ
自分で書いたコードだが、なんか自分でムカツク

57:46
12/03/21 23:34:59.74
>>56
あれ、一つ前のバージョンをコピペってしまった
tails' は init . tails で、定義しないで直に使ってます

結局こんな感じ

comb1 xs = map (:[]) xs
combN' f (x:xs) = map (x:) (f xs)
combN f xs = concatMap (combN' f) (init $ tails xs)

comb xs n = (iterate combN comb1 !! (n-1)) xs

58:デフォルトの名無しさん
12/03/22 01:58:12.62
combination だけはポインタある方が楽だわ


59:デフォルトの名無しさん
12/03/22 08:19:30.23
comb 0 _ = [[]]
comb _ [] = []
comb n (x:xs) = map (x :) (comb (n-1) xs) ++ comb n xs
どうしてもってんならlength xsを最初に数えて持ち回せ。

60:46
12/03/22 12:40:04.54
>>59
美しいですね

こういうセンスあるコードがスラスラと書けるようになりたい

61:デフォルトの名無しさん
12/03/22 22:49:41.00
(x :)
ストライクウィッチーズのあの人に見えた

62:デフォルトの名無しさん
12/03/25 04:51:06.13
(;x;)

63:デフォルトの名無しさん
12/03/25 09:08:01.99
(:[]) ← 口を開けた顔; データを1つ食べて内容物のリストを返す


64:デフォルトの名無しさん
12/03/25 22:18:09.21
書籍「関数型プログラミングの楽しみ」の練習問題 3.1 を考えてみました

これが非正格関数 h に対しては成り立たないのは、
h が実際にどのような関数なのか定義が分からないことには変換が進まないからでしょうか

例えば xs = Nil とした場合でも、

(h . foldL f e) xs
--> h (foldL f e xs)
--> ・・・ h を何に変換すれば良いのか不明 ・・・

もし h が正格関数なら、ここで

--> h (foldL f e xs)
--> h (let g zs = case zs of Nil -> e; Cons y ys -> f y (g ys) in g xs)
--> h (let g zs = case zs of Nil -> e; Cons y ys -> f y (g ys) in g Nil)
--> h e
--> e'

と変換が進む
もちろんこの場合は foldL f' e' からの逆方向の変換もできて等号が成り立ち、
また xs = Cons y ys の場合も構造的帰納法で等号が成り立つことが証明できる

非正格関数 h に対しては、h から先に評価しなければならず、
例えば極端な話 h = h では一向に簡約が進まなくなるから成り立たない場合もある

という理解で良いでしょうか

65:デフォルトの名無しさん
12/03/25 23:14:33.16
hの正格性が必要なのは以下の等式が必要だからでしょう

q (case e of { p1 -> e1; ... pn -> en }) = case e of { p1 -> q e1; ... pn -> q en }


66:64
12/03/25 23:21:45.04
すいません、けっこう混乱しています

それは、単に問題文を言い換えただけではないのですか?
結局 >>65 の場合も「なぜ q が非正格関数だとその等式が成り立たないのか」
を説明しないと練習問題 3.1 を説明したことにはならないような気がするのですが

67:デフォルトの名無しさん
12/03/26 08:28:16.54
xs := ⊥
で両辺計算してみな

68:デフォルトの名無しさん
12/03/26 22:04:32.42
64じゃないけど、

foldL f' e' ⊥ = ⊥
foldLは第三引数について正格な性質を持ってる。
ところが、例えばh = const xで非正格な関数とすると
(h . foldL f e) ⊥ = x
だから、h . foldL f e = foldL f' e'の融合則が成り立つには
hは正格関数でないといけない、ってことかな?

69:デフォルトの名無しさん
12/03/27 03:34:38.13
Haskellを新しく勉強しようと、
まず日本語マニュアルhrefのインストールを下のサイトを参考に
「Haskellのリファレンスマニュアルを検索するツール href」
URLリンク(d.hatena.ne.jp)

$ make
$ mkdir -p /usr/local/share/href
$ export HREF_DATADIR=/usr/local/share/href
$ make bindir=/usr/local/bin install
$ sudo mkhref ref/*
mkhref: HREF_DATADIR: getEnv: does not exist (no environment variable)
このエラーが出て、ここから先に進めません。
こちらの環境はubuntuでghc7.0.3、libghc-network-devのパッケージがインストール済みです。
getEnv関数が手持ちのパッケージでは用意されていないのでしょうか、環境変数の与え方は大丈夫でしょうか
どなたかインストールできない原因分かりましたら教えていただけるとありがたいです

70:デフォルトの名無しさん
12/03/27 19:41:43.97
漏れもハスケるためにう分津にGHCとか入れて準備万端だぜ


71:デフォルトの名無しさん
12/03/27 21:53:06.47
>>69
sudoでmkhref ref/*したときに、
export HREF_DATADIR=/usr/local/share/hrefが効いてないと思う。
それと、ubuntuって/usr/local/share/href が一般ユーザで作れるのかね?
make instalもスーパユーザでやる必要があると思う。

適当にやるならこんな感じか。
$ make
$ sudo bash
# mkdir -p /usr/local/share/href
# export HREF_DATADIR=/usr/local/share/href
# make bindir=/usr/local/bin install
# mkhref ref/*
おわったらスーパユーザを抜けること

使うときもexport HREF_DATADIR=/usr/local/share/hrefが有効になるよう、
~/.profileかどっかに書いておく。

72:デフォルトの名無しさん
12/03/27 22:40:37.45
>>71
Haskell とは何の関係もないが、

$ sudo bash
これやるくらいなら
$ su -
でいいと思うんだが


73:デフォルトの名無しさん
12/03/27 23:34:13.91
>>72
su - だと、cdしなおさないといけないじゃん。
まあ、suだけにすればいいかもだが、rootのパスワードはなるべく入力したくないな。

74:デフォルトの名無しさん
12/03/28 02:38:54.37
sudo -s はどう?

75:デフォルトの名無しさん
12/03/28 03:12:56.50
スーパユーザになれれば何でもいいだろw
>>69は良く分かってないみたいだから、suでrootのパスワード入力させとくのが確実
sudoは設定ちゃんとしてないとうまく動いてくれないかもしれない

まあ、でも、sudo mkhref ref/* が一応実行されてるみたいだから、たぶんsudo -sでもsudo bashでもいいかな

76:デフォルトの名無しさん
12/03/28 08:12:21.70
sudo -E でしょ

77:デフォルトの名無しさん
12/03/28 23:03:43.68
Control.Exception に bracket 関数があるけど、
これって第1引数のアクション(イニシャライザ)で例外が発生しても、
第2引数のアクション(ファイナライザ)は実行さないよね

bracket 関数と同じ形で、
イニシャライザで例外が発生してもファイナライザが実行される関数は
標準ライブラリで用意されてるの?

それとも自作する必要がある?

同じ形というのは、イニシャライザの戻り値が
ファイナライザやコンピュテーションの引数として利用できるという意味

78:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 08:51:07.11
初期化が終わってないのにファイナライズとな…?

79:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 12:38:05.02
>>78
あぁそうか
言われてみれば設計がおかしいな・・・

見直してみるよ
ありがと

80:営利利用に関するLR審議中@詳細は自治スレへ
12/04/01 18:39:21.66
yesodの中の人がcabalの代わりのcabalaって記事出してたけど、
あれエープリルフールなんか?

81:営利利用に関するLR審議中@詳細は自治スレへ
12/04/01 18:52:29.02
cabal は実際に改善点が少なくないわけで、
エープリルフールならもっと分かりやすいネタにして欲しいもんだ

82:営利利用に関するLR審議中@詳細は自治スレへ
12/04/01 19:15:16.28
yesodくらいは、もうはじめからHaskellプラットフォームに入れておいてほしい

83:営利利用に関するLR審議中@詳細は自治スレへ
12/04/01 20:55:29.57
>>82
なんで?

84:営利利用に関するLR審議中@詳細は自治スレへ
12/04/01 21:07:15.70
>>83
スタンドアロン環境で使いたいから

85:営利利用に関するLR審議中@詳細は自治スレへ
12/04/01 21:11:00.55
yesodにcabalaでゆだやんってよく分かるんだけど、宗教色が強いのは
ちょと苦手かも。CLISPも同じなんだがな。

86:営利利用に関するLR審議中@詳細は自治スレへ
12/04/01 21:30:33.12
>>84
なんだよ、それなら Haskell Platform に hmatrix 入れろよとか、
yamapa 入れろよとか、wx や gtk2hs 入れろよとか、iteratee 入れろよとか

そういう単なる「~だったらいいなぁ」というチラ裏と変わらんじゃん

いや、べつにそういうのがダメとは言わないけど、
もう少し Haskell 全体を考えたり、
もう少し本質的なことから論理的に導き出した要望かと思って期待してた

87:営利利用に関するLR審議中@詳細は自治スレへ
12/04/01 21:32:41.92
そう言えば、久々に yampa がバージョンアップしたな

88:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 05:31:58.67
>>87
ホントだ。
でもAnimasの改良取り入れただけかな?
コメントは書いてんのに、ドキュメントのスカスカっぷりは相変わらずゆがみねぇな…。

89:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 12:45:15.77
>>86
「Haskell 全体を考えたいなぁ」もチラ裏と変わらない

90:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 18:36:33.86
プログラミングHaskell とかゆー本買って来たぜ
今夜から枕の下に敷いて勉強する
これで漏れも立派なハスケラーだ

91:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 01:13:37.94
「プログラミングHaskell」って教科書としては優れてるとおもうけれど、
自習書としてはどうなんだろう。
新しい構文とかがけっこう説明なしにでてくるよね。
まあ文法は別の本で見ればいいのか。

あと8章が……



92:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 06:28:43.11
>>91
パーサーは難しいけど、モナドと同じで動かしてみないと、どういう働きか実感できない所があるな
ふつケルでも結局Wiki作る時に書かされるから、この本だけの特別ではない
(初心者置いてきぼりにしないように頑張ってる分だけプログラミングHaskellの方が親切ではある)


93:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 18:52:31.15
HaskellWikiを流し読みしてると色々面白そうなプロジェクトを見つけるのだけれど、
ほとんど開発が止まっているように見えるのは何故だろう

94:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 18:58:32.29
他の言語と違って研究の類いも含まれてるからね。
大学の研究ならほとんどが死んでいるプロジェクトで当然。
卒業したら放置なものが多いから。
これには悪い面もあるが、常に新しい風が吹き込む理由にもなってる。
そういうことも理解して使いこなしたほうがよい。
HaskellWikiも単なる道具に過ぎないのだから。


95:営利利用に関するLR審議中@詳細は自治スレへ
12/04/04 08:26:36.31
そのまま枯れたものとして扱っていいものもあると思うよ。
常に更新されている方がいいとも限らないのでね。
依存関係でおかしくなってるものを放置されてると困るけどね。

96:営利利用に関するLR審議中@詳細は自治スレへ
12/04/05 22:47:55.68
みんなHaskellに飽きたんだよ

97:営利利用に関するLR審議中@詳細は自治スレへ
12/04/06 23:06:06.65
ghc7.2から[リスト内包表記]をモナドにも使えるようになったんだね
有用な使い道を教えてくれ

98:営利利用に関するLR審議中@詳細は自治スレへ
12/04/07 07:53:10.20
対角版リストモナドなんかも内包表記で書ける、とか

99:営利利用に関するLR審議中@詳細は自治スレへ
12/04/07 08:50:43.42
論理プログラミングDSLを自作モナドで簡単にかくためのもの

100:営利利用に関するLR審議中@詳細は自治スレへ
12/04/08 15:11:00.50
cabal の executable-profiling オプションって何に使うの?

101:営利利用に関するLR審議中@詳細は自治スレへ
12/04/08 15:50:48.11
cabal で何かパッケージをインストールすると gcc.exe が起動するけど、
インストール処理が終わった後も gcc.exe のプロセスが消えない

これって、正常じゃないよね

102:営利利用に関するLR審議中@詳細は自治スレへ
12/04/08 16:32:35.76
>>101
どうも、インストール処理の途中で強制終了させた場合に、
ghc.exe のプロセスは消えるけど gcc.exe のプロセスが残るみたいだ

理由はよく分かんないけど、まぁいいや
スレ汚してすまん、気にしないことにして自己解決した

103:営利利用に関するLR審議中@詳細は自治スレへ
12/04/08 22:45:37.91
gtk パッケージにある Graphics.UI.Gtk.Abstract.Widget.onExpose とかの関数って、
Deprecated のカテゴリに分類されてるんだけど、これって非推奨なんだよね

再描画要求のイベントが来た時に反応したいんだけど、
本当は何使えば良いの?

それとも非推奨じゃなくて、近い将来消える予定だけど、
とりあえず今のところはこれ使っとけって意味?

104:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 13:50:38.88
普通のhaskellにあるdata型フィールドの更新

data Anchor = A{aUrl,aLabel ::String}

href :: Anchor
href = A "URLリンク(hoge.com)" "hoge page"

main = do
print href
print (href {aLabel = "that"})

このコードだけだとAnchor型がprintの引数になるShowクラスのインスタンスではないから、
表示されないのはいいとして、
再代入(実際は再定義)「href{ aLabel = "that"}」
この上のコードでhrefのaLabelフィールドが"that"に変わって、aUrlはそのままになるらしいんだけど
普通にコンパイルエラー、これは可能なの?


105:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 14:22:21.53
href { aLabel = "that" }の型はAnchorだ
aLabelを更新してaLabelの値が返ってくるわけじゃない
Cの構造体とかはこうだけど

レコード更新構文は、既存の値から一部を変更しただけの新しい値を作りたいとき、
A { aUrl = aUrl href, aLabel = "that" }
と書かなきゃいけないところを
更新する必要のあるフィールドだけ書けばいいだけにする、というただの構文糖衣。

106:営利利用に関するLR審議中@詳細は自治スレへ
12/04/10 14:44:21.12
>>105
printが可能かではありません、誤解を招いてすいません(原文のままコードを記述したため)

href { aLabel = "that"}は実質、A { aUrl = aUrl href, aLabel = "that" }で
これはhrefを再定義する構文ではなくて、hrefとは別のAnchor型で,hrefのaLabelフィールドだけ変えた値を作っているということですね
hrefの再定義だと思っていたので、
href {aLabel = "that"}を単文でdoの中に入れたときにエラーでん?と思ったのですが納得しました

107:デフォルトの名無しさん
12/04/13 18:13:46.76
なんかコメントあしばらく出てないけど、haskellの皆さんどうしたの?

108:デフォルトの名無しさん
12/04/13 21:31:53.54
Windows7 で ghc や ghci を起動させようとすると、
初めの1回だけ、よく 0xc0000142 のエラーが出るよね

あれ何なの?

どちらももう一回トライすれば普通に起動するから、
そのまま使い続けてるけど、なんかマズイかな

109:デフォルトの名無しさん
12/04/13 23:26:35.58
wx パッケージが 0.90 にバージョンアップして、
とうとう wxWidgets 2.9 only になった


110:デフォルトの名無しさん
12/04/14 16:01:19.30
>>107
特に質問することが無いんだもん・・・
初心者でも簡単に書けるようになるのは良いけど、スレが盛り上がらないのも確かだな・・・


111:デフォルトの名無しさん
12/04/14 16:10:39.33
>>108
出たこと無い・・・32ビットの頃では何も問題なかったし、今の64ビットでもghci上で(横に)長めの入力すると挙動が怪しくなるくらいかな
それでもrubyのirbよりは安定してるが・・・(すぐ激重になって使い物にならん)


112:デフォルトの名無しさん
12/04/14 17:12:23.96
wx が ghc 7.4.1 環境にまともにインストールできるようなったのは喜ばしいし、
styledTextCtrl などのコントロールもちゃんと使えるようになったのはいいんだが、
ghc のリンク処理と、出力された実行ファイルの起動に時間がかかるようになった

特にリンクは時間かかりすぎ
コンパイル自体は普通に速いのに、リンクでフリーズしたかと思った
これは、wxWighets の方のビルド設定で改善できるんだろうか

あと、相変わらず ghci 上では実行できない

まぁ些細な問題だ
あとは wxPack が 2.9 にバージョンアップすれば初心者にも勧められる

113:デフォルトの名無しさん
12/04/14 23:40:32.24
>>112
今 GLCanvas の対応とかどうなってるのか色々試してるけど、
前言撤回、些細な問題ではなかった

このリンクの遅さは異常だ、イライラする

メインウィンドウをひとつ表示するだけのプログラムでも、
オプション無しで ghc を実行して exe ファイルへのリンクするのに 50 秒以上、
その exe ファイルを実行してからウィンドウが表示されるまで 5 秒以上かかる

wxWidgets のビルドオプションをモノリシックと非モノリシックで両方試したけど、
どちらもリンクや起動の時間に対して目に見える影響はなかった

これ、俺だけ?
なにか改善する方法は無いんだろうか

とくに無ければ、少なくともバージョンアップするまでは gtk2hs を使うしかないな

[環境]
Windows7
ghc 7.4.1
wx-0.90

114:デフォルトの名無しさん
12/04/15 08:47:17.26
副作用論争は、読んでいて面白かったが。今論争はないのか?。

不毛かもしれない宗教論争とはいえ、純粋志向のハスケラをおちょくっているのを見るのは楽しい。

この論争はハスケルには処理系を含めてあらゆるレベルで副作用がない、
という無理な主張から始まったと思う。

言語自体には副作用がない、でも、処理系には副作用があるようにみえる。
でも、それは勘違いだ。ハスケル処理系にもまったく副作用がないのだ。
副作用が発生しているのはハスケル処理系でなく、ハスケル処理系が
生成したDanoMoi処理系だ。

という主張がありましたね。

115:デフォルトの名無しさん
12/04/15 09:33:43.50
釣れますか?

116:デフォルトの名無しさん
12/04/15 09:34:37.44
頭悪そうw

117:デフォルトの名無しさん
12/04/15 10:14:32.40
ごめんなさい

隔離スレ  スレリンク(tech板)
で暴れてた馬鹿がこっちに逃げて来たみたいです
FizzBuzzすら書けない口だけ野郎なんで無視してもらって結構です

118:デフォルトの名無しさん
12/04/15 11:13:37.90
>>114
URLリンク(www.kmonos.net)
> 15:49 06/09/08 DanoMoi と Haskell
>決して「実際にそういう実装/理論になっている」という話ではなく、
>「こういう風に考えとけばわかる気がする」みたいな話なのでよろしくお願いします。
> ・Haskell プログラムには、一切いかなる意味でも副作用は存在しない
> ・Haskell プログラムは、"DanoMoi" というプログラミング言語のプログラムを生成する。
>"DanoMoi" という名前および概念は今私が勝手に考えたので適当ですよ。

プログラムと処理系は同じ意味だと思っているのですか?

119:デフォルトの名無しさん
12/04/15 13:41:43.29
スパコンの世界じゃ、OSとハードウェアは同じ意味だしな…

120:デフォルトの名無しさん
12/04/15 13:43:34.33
>スパコンの世界じゃ、OSとハードウェアは同じ意味だしな…
ないない。

121:デフォルトの名無しさん
12/04/15 14:04:53.77
>>120
新しく世界一のスパコンを作った = ハードウェアとそれ専用のOSを作った(むしろハードウェアはそのままでOSだけを改良した)

122:デフォルトの名無しさん
12/04/15 14:15:40.44
SISCマシンの設計図はハードウェアの設計図だろうか? ソフトウェアの設計図だろうか?

123:デフォルトの名無しさん
12/04/15 15:59:38.46
>>119
アホ丸出しで恥ずかしくないの?

124:デフォルトの名無しさん
12/04/15 16:04:00.61
>>123
大学でスパコンの講義受けるとOSとハードは同じだと教わるよ

125:デフォルトの名無しさん
12/04/15 16:13:02.27
システムソフトウェアとハードウェアを一緒に開発しているだけの話で「同じ」ではない。

126:デフォルトの名無しさん
12/04/15 16:24:20.62
>>125
スパコンは、ファイル管理システムとハードウェアとは不可分
逆に言うと、OSだけを取り出せと言われたら、LSIをペンチでいくつか取り出すことになる

DOS/V機やUNIXを使っていると分かりずらいが、UNIXで言うと、常駐ソフトとカーネルの一部がハードウェアそのものになってる

127:デフォルトの名無しさん
12/04/15 17:03:17.98
何というデマ…

128:デフォルトの名無しさん
12/04/15 17:08:26.97
通常ならOSで実現されている機能の一部がハードウェア上で実装されているとしても、
それを「OSとハードウェアは同じ意味」とか言っちゃうのは痛い。
さらにスパコンと呼ばれるものがすべからくそういう構成をとってると思い込んでるのも痛い。

129: ◆0uxK91AxII
12/04/15 18:19:56.27
>>126
誰が教えたの?

130:デフォルトの名無しさん
12/04/15 18:33:14.08
> UNIXで言うと、常駐ソフト

デーモンという言葉すら知らない幼稚園児レベルのド素人は、まずは幼稚園に行けば?

131:デフォルトの名無しさん
12/04/15 18:36:50.24
だえもんさんなめてんの?

132:デフォルトの名無しさん
12/04/15 18:38:20.84
>>126
ノードやバスのファームウェアも含めてアップデートするんで、ソフトウェアだけで配布されてますが?
使ったことないんじゃないの?

133:デフォルトの名無しさん
12/04/15 18:43:44.98
スレチなやつは全員立ち去れ

134:デフォルトの名無しさん
12/04/15 19:25:43.97
>>126, >>128
内容云々より、分かりずらいだのすべからくだの
日本語が気になってしょうがない

135:デフォルトの名無しさん
12/04/15 20:38:41.03
ああ、日曜日だ・・・

136:デフォルトの名無しさん
12/04/16 07:13:57.36
月曜日です。
関数型言語使いには無職が多いと聞きます。
皆が働いている時間に勉強や議論ができます。良かったですね!
今日も有意義に過ごしましょう!

137:デフォルトの名無しさん
12/04/16 07:23:29.97
働いてるから、という不勉強の言い訳は、頭のおかしい企業以外では通らないよw

138:デフォルトの名無しさん
12/04/16 07:23:33.83
みんな賢いからyoung retireして、余生を関数型言語のプログラミングで楽しんでるんだよ。知らなかった?

139:デフォルトの名無しさん
12/04/16 07:53:15.45
>>136
今日も一日ドカタ仕事頑張ってね!

140:デフォルトの名無しさん
12/04/16 07:54:30.89
匿名掲示板で職業なんてどうでもいいので少しはHaskellの話でもしませんか

141:デフォルトの名無しさん
12/04/16 09:22:55.36
Haskellの話なんざHaskell Cafeだの#Haskell等で好きなだけしてろ

142:デフォルトの名無しさん
12/04/16 10:07:06.63
ボクの分からないむずかしい話しちゃだめー

143:デフォルトの名無しさん
12/04/16 21:46:45.82
>>128
実は正確にいうとスパコンに限らず、そこら辺のAT互換機もハードウェアとOSは同一
(スパコンはハードウェアとOSをセットで開発しないと、ハードウェアを作ったとは言わない)
特にHaskellを扱うようなソフトウェア科学から言えば同一と言わなければならない
理由はハードウェアを抽象化したモノがOSだから

ゲート回路だけでOS全部を構築しててもC言語でOS全部を書いていても、プログラムからは一切区別できない
区別できないってことは同じということ

144:デフォルトの名無しさん
12/04/16 22:36:02.49
意味わかんない。日本語でおk、レベル。

たとえばforkシステムコールをどうやって論理回路で実装するのか、論文が一本でもあったら示してくれ。

145:デフォルトの名無しさん
12/04/16 22:42:55.75
>>144
相手にしちゃダメ

146:デフォルトの名無しさん
12/04/16 22:46:57.64
>>144
論理回路でチューリングマシンを実装すればいいじゃん

147:デフォルトの名無しさん
12/04/16 22:52:33.55
forkってメモリコピーするだけじゃん

148:デフォルトの名無しさん
12/04/16 23:00:17.85
>>144 >>146
USBメモリと同等のモノはFFとNANDゲートだけで構成できる
USBメモリの中にOSを入れることができる
つまり論理回路しかなくてもOSは構成できる

149:デフォルトの名無しさん
12/04/16 23:06:10.28
紙と鉛筆でも構成できそうだな

150:デフォルトの名無しさん
12/04/16 23:12:15.14
>>148
OS → Haskellの言語処理系

USBメモリと同等のモノはFFとNANDゲートだけで構成できる
USBメモリの中にHaskllの言語処理系を入れることができる
つまり論理回路しかなくてもHaskllは構成できる

>>150 相手しちゃダメっ

151:デフォルトの名無しさん
12/04/16 23:13:33.35
なんやその矢印は
シミュレーション関係とかΣ代数ホモモルフィズムとかちゃんと意味かけやぼけー

152:デフォルトの名無しさん
12/04/16 23:18:00.73
ニヤニヤ☆
その程度の頭で数学やってるんだw

153:デフォルトの名無しさん
12/04/16 23:27:59.61
>>149
設計に従って手で鉛筆と紙を動かせば問題ない

>>150
Haskellを経由しないシステムコールを禁止すれば、HaskellプログラムかHaskellより高水準のプログラミング言語から見ればそのHaskell処理系がOSでありハードウェアということになる
つまりHaskellマシン

154:デフォルトの名無しさん
12/04/16 23:28:52.93
>>148 アホか。どんなソフトウェアだろうがメモリに存在できるんだからハードウェアになっちまうだろうが。
スーパーコンピュータに限らず、あらゆるコンピュータのあらゆるソフトウェアが。

スーパコンピュータのOSが特別、というのがお前の主張だったよな。

> DOS/V機やUNIXを使っていると分かりずらいが
とお前は言っている。それをちゃんと説明しろ。できなければ回線切って吊るか消えろ。

155:デフォルトの名無しさん
12/04/16 23:33:31.56
おれはスレチ全員が回線切って吊るか消えてほしい

156:デフォルトの名無しさん
12/04/18 22:13:15.53
>>154
DOS/V機やUNIXはOSのうちソフトウェアの可換性の高い部分が多く、ユーザがさわって移植している部分こそがOSだと勘違いしているから、DOS/V機やUNIXを使っていると「OSがハードウェアと同一だと」分かりずらい

新しいスパコンを開発するときには、OSに他のハードとの可換性がないため、OSとハードウェアは完全に同一
「新しいスパコンを開発した」とは「新しいOSを開発した」と同意語で、この認識は世間一般でも認められている
筐体の中のLSIに一切変更を加えなくても、OSの改良で「新しいスパコンを開発した」とニュースになる

ソフトウェアは抽象度によってハードウェアから独立するので、あらゆるコンピュータのあらゆるソフトウェアをハードウェアとは呼ぶのは正しくない
プログラムの電子データのビット列とそれを格納してる機構はハードウェアだが、プログラムのセマンティクスはハードウェアではない
ただひとつ例外があって、OSというプログラムはそのセマンティクスがハードウェア

157:デフォルトの名無しさん
12/04/18 22:26:59.45
>>156
スパコンのOSはLinixやAIX(IBMのUNIX),IRIX(SGIのUNIX)等、UNIX系OSである。
Linix、AIX、UNIXはソフトウエアである。
したがって、スパコンのOSはソフトウェアである。

この問題についての詳しい議論は、こちらのスレ↓が適している。
スレリンク(tech板)

158:デフォルトの名無しさん
12/04/18 22:39:40.50
>>157
スペルミス。LinixはLinuxの誤記。ちなみに京にはLinuxが移植された。

159:デフォルトの名無しさん
12/04/18 22:42:45.46
>>157
スパコンのOSはLinixやAIX(IBMのUNIX),IRIX(SGIのUNIX)等、UNIX系OSである。
スパコンのOSはハードウェアである。
したがって、スパコン以外のUNIX系OSもハードウェアである。

160:デフォルトの名無しさん
12/04/18 22:47:24.63
>>158
京はノードに少し改良したLinuxを入れてて、京そのもののOSは移植じゃなくて改良

161:デフォルトの名無しさん
12/04/18 22:55:14.12
>>159
> スパコンのOSはLinixやAIX(IBMのUNIX),IRIX(SGIのUNIX)等、UNIX系OSである。
↓この間に飛躍がある。
>スパコンのOSはハードウェアである。←根拠を省いた断定。

162:デフォルトの名無しさん
12/04/18 23:08:22.98
>>161
別の言い方をしましょう
「例えば、HaskellでプログラミングしてるときのOSって何?」
「Haskellでプログラミングしてるとハイパーキューブとかのハードウェア構造が消えるけど、ハードウェアは何に吸収されたの?」

163:デフォルトの名無しさん
12/04/18 23:14:00.03
>>119が元凶か。IDないと面倒だね

164:デフォルトの名無しさん
12/04/18 23:15:54.30
>>162
それこそ初心者スレへどうぞだよ(OS,UNIX板あたりも含めて)。
もう少しコンピュータのいろはを勉強するか、あるいは無知の知に気がついた方がよい。
ヒント
・言語処理系から見たOSはライブラリの下でsystem callとして呼び出され機能している。
・OSは(というか通信ミドル)はトポロジーを特に隠さない。
 むしろトポロジーを意識して並列分散したほうが性能がでる。
 Haskellがトポロジーを露わに扱う術を持っていないだけである。

165:デフォルトの名無しさん
12/04/19 00:45:36.21
ヒント、とか言って得意げに語りだす奴w

166:デフォルトの名無しさん
12/04/19 00:50:20.71
何の根拠もないのに
「スパコンのOSはハードウェアである。」
とかトンデモな断言をするより遙かにましだろ。

「UNIX系OSもハードウェアである。」
に至っては、初心者スレではなく、もはや病院行けとしか言いようがない。
恥ずかしすぎるので人前では決して言わないように。

167:デフォルトの名無しさん
12/04/19 01:33:45.40
っ鏡

168: ◆QZaw55cn4c
12/04/19 02:29:21.51
ふつうのhaskellを読んでいます。
ghc 7.2.1 以降は
import System
とすると、

could nod find module 'System'
It is a member o the hidden package 'haskell98-2.0.0.0'
use -v to see a list of the files searched for.

とでてコンパイルできません
ghc 7.0.4 ではコンパイルできます。
7.2.1 以降でコンパイルできるようにするにはどうしたらいいでしょうか?
環境はWindows7 です。
URLリンク(ideone.com)

169:デフォルトの名無しさん
12/04/19 02:46:32.16
import System.Environment
にすればおk

170:デフォルトの名無しさん
12/04/19 20:50:07.23
>>164
System call がハードウェアとの接触点ということでしょう
ということは、rawSystem から向こうは全部ハードウェアです

仮に、Haskellプログラムがプログラム上の言明でトポロジーにアクセスできてどのノードのどのLSIのどのメモリのどのビットを1にするか指定していたら、そのプログラムはOSです

171:デフォルトの名無しさん
12/04/19 21:04:49.64
>>166
・コンピュータ科学では、「どのコンピュータの」OSもハードウェアと「原理的に」同一
・一般のコンピュータ科学を知らない人たちは、スパコン業界のハードウェアとOSを同一視している

分からなければ、次の話を考えればいい

今パソコンの中に10cmくらいの512MBのメモリが入っている
この世から、プログラムを高水準のモノから次々の削除していく
一度削除したら、そのプログラムと同じことができるモノは永遠にこの世に出てこない

これを続けていくと、OSが削除されたときに512MBのメモリはハードウェアではなくなり、ただの石になる

もっと言うと、川べりに落ちてるただの石も、その石を動かすシステムがあって、Haskellプログラムからそのシステムにアクセスできて計算に利用できれば、そのシステムはOSであり、そのOSと石はハードウェアになる

172:デフォルトの名無しさん
12/04/19 21:22:33.36
喩えの方が余計わかりにくい

173:デフォルトの名無しさん
12/04/19 21:59:04.77
独自用語とたとえで持論を語り出す電波さん。
持ちネタはそんなにないから、しばらくすれば満足して黙る

174:デフォルトの名無しさん
12/04/19 22:06:58.32
もっとわかりやすく言うと、例えば論文読んでてプログラムからハードウェアへの入力x(t)があったとき、これそのままOSへの入力
例外はOSの論文読んでるときだけ

175:デフォルトの名無しさん
12/04/20 00:43:47.39
>>171
この世にこれほど頭の悪い人を見たことがない。

176:デフォルトの名無しさん
12/04/20 02:42:48.57
>>171
すれ違い迷惑です。退場してください

177:デフォルトの名無しさん
12/04/20 13:03:38.27
Haskellの話しようぜ。そういえば来月 Learn You Haskell ... の日本語訳出るんだよね。

178:デフォルトの名無しさん
12/04/20 16:23:19.18
せっかくだから
URLリンク(www.haskell.org)
どうよ?

179:デフォルトの名無しさん
12/04/21 22:14:24.35
parallel と concurrent がごっちゃになってる気がしないでもない

180:デフォルトの名無しさん
12/04/22 07:57:37.73
ふむ
URLリンク(www.haskell.org)

181:デフォルトの名無しさん
12/04/22 08:05:10.57
並列と並行の定義は微妙に意見分かれるよね

182:デフォルトの名無しさん
12/04/22 11:52:22.81
>>178は最初から最後までparallelの話じゃね?

183:デフォルトの名無しさん
12/04/22 11:55:45.93
data parallelだから当然だな。

184:デフォルトの名無しさん
12/04/24 23:23:42.89
Yampa でのゲーム作りは論文を参考にしてだいたい分りました
(論文のインベーダーを改造したり、ブロック崩しを作ったりしました)

一方、同じく FRP ライブラリの Reactive の方では、
どのようにゲームを作るのか

具体的には、個々のキャラを毎フレーム独立に動かしながら、
かつ互いに(衝突などで)関連を持つようにするには、
どのようなフレームワークを考えれば良いのか
生成や消滅はどのように考えるのか

参考になりそうな文献や記事は無いでしょうか

自分では、イベントとシンクの考え方がユニークで面白いので、
これをゲームオブジェクト間の関連に使えないかと考えているのですが、
他の人はどのように考えているのか、参考にしたいです

185:デフォルトの名無しさん
12/04/25 01:23:27.55
Reactiveはもうメンテされてなくて、今のGHCじゃコンパイルできないから俺はノータッチだけど、
Yampaは、Reactiveなんかの古典FRPを写像変換子のアローとして再構築したライブラリだから、基本的なところの考え方に違いはないはず。

というか、生成、消滅、衝突とかをどう考えたらいいかわからないってのは、FRPの基本的な考えを理解してないからじゃないか?

時間に応じて離散的に変化する値を[(Time, a)]という無限リストだと捉えるのがイベント
時間に応じて連続的に変化する値をTime -> aという型の連続関数だと捉えるのがビヘイビア

こいつらに対して、
定刻tを過ぎたらイベントを発する atTime :: Time -> Event a
ビヘイビアを積分する integral :: Behavior a -> Behavior a
イベントが発生したタイミングで、ビヘイビアの値を補足した新しいイベント作る snapshot :: Behavior a -> Event b -> Event (a, b)

みたいなコンビネータを使ってごにょごにょするのがFRP。

例えば、キャラの移動速度の変化をビヘイビアとして定義して、integralで積分すれば、それが各時刻におけるキャラの位置のビヘイビアになる。
衝突、生成、消滅、キャラのステータス状態の変化、キー入力なんかは、イベントとして考えられるし、
毎フレームの更新自体もイベントとして考えられて、各キャラの更新は

map (flip snapshot updateEvent) charactor

みたいに書けば、それが各フレームのキャラの状態変化を表すイベントになる。
こんな感じで、イベントとビヘイビアを組み合わせて、より複雑なイベントやビヘイビアを作ってく。

とりあえず、Haskell wikiからたどれるリンクを片っ端から読みあさるのが良いと思う。
URLリンク(www.haskell.org)
URLリンク(www.haskell.org)

本だとSOEが有名。
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
 URLリンク(www.amazon.co.jp)

186:デフォルトの名無しさん
12/04/25 02:00:46.52
ちなみに、Yampaはイベントも矩形波みたいな時刻tの関数だと捉えて、
全てTime -> aという連続関数として考えるのが基本的なアイディア。
イベントやビヘイビアの合成は、

SF a b = (Time -> a) -> (Time -> b)

という写像変換として定義して、その枠組みにアローを使ったと。

古典FRPの概要と欠点とか、AFRPが何を改善したのかとかは
URLリンク(www.haskell.org)
から辿れる、ITU-FRP2010 のスライドで説明されてるから見とくと良いと思う。

187:デフォルトの名無しさん
12/04/25 04:37:14.33
Haskell的な処理の仕方がどうにも見につかない
実際に使われてるコード読みまくるか

188:デフォルトの名無しさん
12/04/25 19:19:28.33
>>185
Yampa でゲームを作る場合、
pSwitch 系の関数を中心にイベント周りを組み立てるのが一般的ですよね
(論文 The Yampa Arcade や、これを引用してる他の論文などでも基本的にそうなってます)

まず、現在発生しているゲームオブジェクトを全てまとめたコレクションを作っておく

その上で、たとえば pSwitch 関数や dpSwitch 関数を使うのでしたら、
各ゲームオブジェクトや外部入力を起源とするイベント(衝突やビーム発射)を
発生させる関数を第1引数に渡す

コレクションの初期値を第2引数に渡す

第1引数の関数で発生したイベントを、コレクション内のゲームオブジェクトを
生成したり消滅させるイベントに変換する関数を第3引数に渡す

第3引数の関数で発生したイベントを解釈して
実際にコレクションを修正する関数を第4引数に渡す

細かいことはとりあえず抜きにして、大まかにはこんな感じだと思います
こうやって作った pSwith 関数や dpSwitch 関数の戻り値であるシグナル関数に、
ゲームを回すのに必要なシグナルを毎フレーム送るようにする

非常に分りやすく、イベントの伝達がスッキリして、
Yampa はかなり良い基盤を提供してくれると思っているのですが、
こういった基盤は Reactive の方ではどのようになっているのか聞きたいです

Reactive では Yampa みたいなイベント周りの仕組みを一ヶ所に集中させるのとは
また違った方法をとっているのでしょうか


189:184
12/04/25 19:22:23.08
>>188
すいません、>>185 が Reactive についてはノータッチなのは分ってますが、
とりあえずどこかへアンカーを付けないと、後から話の流れが追いにくいと思いまして

190:デフォルトの名無しさん
12/04/27 11:55:44.48
まだインクリメンタルGC実装されてないのかよ

191:デフォルトの名無しさん
12/04/27 12:00:24.86
2000年以前に提案があったのにいまだに出来ないというのは実質無理ということなのだろうな
Non-stop Haskell(笑)

192:デフォルトの名無しさん
12/04/27 12:01:31.38
Real Time Haskell

193:デフォルトの名無しさん
12/04/27 12:15:26.39
メモ化による効率化の方法がわからない。。。
λカ娘(二期)を読んだらメモ化には Control.Monad.Memo (cabal install monad-memo)を使うといいよ的な
事が書いてあったのでHackageあたりの文書をチラ見してるけどフィボナッチ数列のメモ化だけの例じゃ
理解できない。。。

Hackageの文書みると「モナディックフォームに変換」とかさらりと書いてるので、もしかしてこれを使える
ようになるためにはモナドがちゃんとわかってないといけないんでしょうかね。

Control.Monad.Memoが使える程度のモナド理解のためのオススメ文書などあったらどなたか教えて
頂けないでしょうか。

194:デフォルトの名無しさん
12/04/27 17:31:00.49
データをグラフにするのにニュープロットとカイロ
どっちのバインディングライブラリが幸せになれるかな
ドザです

195:デフォルトの名無しさん
12/04/27 18:02:32.57
>>193
fib n = fib (n-1) + fib (n-2)

のところを

fib n = let
 n1 = fib (n -1)
 n2 = fib (n - 2)
 in (n1 + n2)

と書いて、モナド形式に変換した~と言ってる2番目の例と比較してみればわかるんじゃないかな。
do が let、<-が=、returnが(大体)inに対応していると思って。
(これは他のどのモナドでも同じ。do文はモナドによって特殊な振る舞いを組み込む事の出来るlet式。
MonadFixのインスタンスにしてDoRec言語拡張でrecキーワードを有効にしないと再帰束縛はできんけど。)

関数を呼び出す際に、1引数関数(k -> Memo k v)と、値kを取る、memoって関数を介して呼び出すと、kに対する計算結果をメモ化してくれる。
これは、適用演算子($) :: (k -> v) -> k -> vにメモ化機能付けたもの、と考えてもおkだと思う。

異なる関数で相互再帰したりする場合はそれぞれ違うメモモナドを使わないとダメっぽいので、モナド変換子を理解してないとちょっとむずいかも。

196:デフォルトの名無しさん
12/04/27 19:22:43.33
>>190
いまどれぐらいストップザワールドするんだろう?

197:デフォルトの名無しさん
12/04/27 21:15:42.26
>>177
これ、Amazonに登録されてました

198:デフォルトの名無しさん
12/04/27 21:28:53.03
評判の良い本だから楽しみだな
欲を言えば連休中に読みたかった

199:デフォルトの名無しさん
12/04/27 22:33:02.95
>>197
そういう時はURLもお願いします。
ところで同時チェック商品が「情報処理2012年05月号別刷」です。
Haskellユーザは情報科学に興味がある人が多いのですね。

すごいHaskellたのしく学ぼう! (2012/5/23発売)
URLリンク(www.amazon.co.jp)

情報処理2012年05月号別刷
「《特集》CGMの現在と未来: 初音ミク,ニコニコ動画,ピアプロの切り拓いた世界」
URLリンク(www.amazon.co.jp)

え?初音ミクとニコニコ動画特集?
プレミアム会員の私が言うのも何ですが、
Haskellとはユーザ層が被らないとばかり思ってました。

200:デフォルトの名無しさん
12/04/27 23:02:51.55
これがステマというやつか

201:デフォルトの名無しさん
12/04/27 23:13:54.70
まったく。なにがURLもお願いしますだよw

202:デフォルトの名無しさん
12/04/27 23:19:57.80
>>200
ステルスに失礼だろ

203:199
12/04/27 23:44:34.50
URLも日本語版のタイトルも書いてないから探すのに無駄に手間取りました。
>>199をステマと思った人は自分の判断力がその程度だと自覚してください。

204:デフォルトの名無しさん
12/04/28 00:26:50.05
Learn You Haskellでググったら一発、
ていうかこのスレにいるような層で原著知らないやついるんだなあ
自分のアンテナが低レベルだと自覚してください

205:デフォルトの名無しさん
12/04/28 01:15:00.48
前スレ736に日本語版タイトルが出ているのを思い出せなかった>>199はアンテナが低レベル。
日本語版を探している人が原著を知らないと判断した>>204は判断力が低レベル。

ということで、以後何もなかったかのようにどうぞ。

206:デフォルトの名無しさん
12/04/28 01:15:22.02
>>203
>>203
>>203

207:デフォルトの名無しさん
12/04/28 01:54:56.47
>>205
いやだからさ、「Learn You Haskell 翻訳」 とかでググったら
日本語版のタイトル出てくるよってことなんだが…
そこまで言わんと分からんかね

208:デフォルトの名無しさん
12/04/28 02:09:15.28
原著知ってれば尼で適当に検索すれば表紙ですぐ分かる

209:デフォルトの名無しさん
12/04/28 02:15:34.87
URLリンク(learnyouahaskell.com)
ApplicativeとかMonoidの話もあるのか、買いだな

210:デフォルトの名無しさん
12/04/28 06:33:10.05
あー、なんかごめん

211:デフォルトの名無しさん
12/04/28 07:34:34.99
いいってことよ

212:デフォルトの名無しさん
12/04/28 20:07:01.35
GADT

これって、なんて発音するの?
カフェテラスで議論する時に困る

213:デフォルトの名無しさん
12/04/28 20:12:31.04
じーえいでぃーてぃー 以外の発音は聞いたことがない

214:デフォルトの名無しさん
12/04/28 20:29:16.32
そっか

HTML がハトマルだから、GADT も何かあるのかと思ってた

ありがと

215:デフォルトの名無しさん
12/04/28 21:12:57.68
>HTML がハトマルだから
いやいや

216:デフォルトの名無しさん
12/04/28 21:41:36.82
ハテマラだろwwwwwwwwwwww

217:デフォルトの名無しさん
12/04/28 23:08:53.77
GenericなADTだからじーえーでぃーてぃーが自然な発音だろうけど、俺は最初ガッドって読んじゃってこの発音が離れない。

218:デフォルトの名無しさん
12/04/28 23:36:16.79
ガドト派はいないの?

219:デフォルトの名無しさん
12/04/28 23:44:01.61
俺もpwdコマンドがプリントワーキングディレクトリだけど
パウドゥって脳内で響くのが治まらない
プワディって呼ぼうかな

220:デフォルトの名無しさん
12/04/29 00:27:16.78
言語拡張オプション名が GADTs だから GADT もいっしょにガッツって読んでる

221:デフォルトの名無しさん
12/04/29 02:34:16.91
>>195
ありがとうございます。モナドをもう少し真面目に勉強してみます。

222:デフォルトの名無しさん
12/04/29 10:54:07.47
>>217
> GenericなADTだからじーえーでぃーてぃーが自然な発音だろうけど、俺は最初ガッドって読んじゃってこの発音が離れない。

私もこれ

223:デフォルトの名無しさん
12/04/29 12:25:33.10
リワハで勉強していくとモナドトランスフォーマ辺りで脳が軋む
この書籍、後半部分に誤植が多発してるね

224:デフォルトの名無しさん
12/04/29 12:40:02.36
リワハwww

225:デフォルトの名無しさん
12/04/29 12:53:35.88
>>223
モナド変換子はマジむずい。
あれは理屈を理解するよりも、コンパイルして怒られてを繰り返して体で覚えた方がはやいかもしれない。
まずはliftIOだけ使って、コードのどの部分がどんな型になってんのか把握できるようになるまでガンバレ。

226:デフォルトの名無しさん
12/04/29 14:07:50.00
さぁ次はmonad-controlの攻略だ・・・

227:デフォルトの名無しさん
12/04/29 14:22:11.84
それよりも Arrow のやさしい解説本を洋書でも良いから誰か書いてくれよ

ところで、Arrow の利用って FRP かパーサーくらいしかないの?

228:デフォルトの名無しさん
12/04/29 14:46:37.22
Arrowよか最近はconduitやら何やらのComonad系のやり方の方が熱いと聞いた
しかしComonadはArrowよかさらに文献が少ないと言うw

229:デフォルトの名無しさん
12/04/29 15:41:09.55
>>227
Arrowの導入は「関数プログラミングの楽しみ」に1章分だけど出てる
印象としては抽象度が高すぎてかえって使いづらい
始めからArrowとして設計されてたら、もっと使い勝手がよかったと思う

230:デフォルトの名無しさん
12/04/29 16:03:42.43
>>229
うん、持ってる

> 抽象度が高すぎて
まさにこれ、やさしいとは言いがたい

ネット上の解説も、回路図で first とか right とか説明して、
最後にこれが大ボスと言わんばかりに loop をちょろっと解説して終わりなのが多い
しかも、どれも抽象的

なんかこう、実例みたいなのが無いんだよなぁ

ひとつ論文で、パーサーの例を挙げて、
こうすればスペースリークを防げるよねって解説があったけど、
あれがまだましな方だったな(論文の方が分りやすいってどうよと思うが)

231:デフォルトの名無しさん
12/04/29 16:57:45.72
(>>=)って左結合なのにどうして左の方で束縛した値が右の方で使えるの?

     __
((((((((((束縛)  )  )  )参照)  )  )  )  )  )

スコープ的にどうなってんの?


右結合だったら自然に見える事は理解できるんだが
      _______________________
(  (  (束縛(  (  (  (  (  (参照(´・ω・`))))))))))

232:デフォルトの名無しさん
12/04/29 17:10:59.47
>>231
モナド則でこうなってるから
(m >>= f) >>= g == m >>= (\x -> f x >>= g)

233:デフォルトの名無しさん
12/04/29 17:21:25.38
>>231
(>>=)は左結合だけどdoは右結合だから問題ない
明示的に(>>=)とラムダを使う場合でも、
a >>= \x ->
b >>= \y ->
c
なら、
a >>= (\x ->
b >>= (\y ->
c))
のことだから、やはり問題ない(ラムダ式は可能な限り右まで続く)

>>232
モナド則は関係ない

234:デフォルトの名無しさん
12/04/29 18:17:44.38
>>233
……infixl 1と宣言しておきながら、事実上は右結合なんですか?

右結合って短絡可能なんですよね?

Maybeモナドでは
左にNothingなら問答無用でNothing
ってなってるけど

処理が右結合で、途中Nothingに出逢ったら
Real World Haskellではそのまま最後までNothing伝播処理が続くって書いてあった

でも僕の考える限りでは、右結合では右側が判明するまでの必要最低限の努力をするのが遅延評価だから
途中でNothingに出逢った瞬間からスタック巻き戻しのようになると思うのですが……


/\
 /\
  /\
  N /\
    /\
      :
      /\
       /\
/\
 /\
   N
/\
  N

Nothing

235:デフォルトの名無しさん
12/04/29 19:24:55.15
>>234
構文の話と意味の話をごっちゃにしてないか
左結合(infixl)というのは、あくまで
a >>= b >>= c
というふうに使ったときに
(a >>= b) >>= c
と解釈される、というだけの意味。それ以外の使い方をした場合には関係ない

後半はその通りで、(Nothing>>=f)はfを呼ばないから、たとえばdoの中でNothing
が出て来たらそれ以降は評価すらしない
そのNothingが別のdo(呼び出し元の関数とか)に渡ったときには
Nothingの伝播処理が挟まる

236:デフォルトの名無しさん
12/04/29 21:27:11.79
>>235
質問①
 Maybe 上で (>>=) あるいは (>>) を使ってたくさんの計算を連鎖するとき、
その計算のどれかが Nothing を返したら、残りの計算は一切評価されません。
 しかしこの連鎖は完全には短絡されていないことに注目しましょう。
連鎖中のそれぞれの (>>=) や (>>) は左の Nothing にマッチすると右に Nothing を生成し、
最後までそうしていきます。この点は忘れやすいものです。
連鎖中の計算が失敗したとき、それに続くNothing 値の生成、連鎖、消費は実行時に安価ではありますが、タダというわけではありません。


348 P にこう書いてありますが、私にはこの文脈が左結合を示唆しているかのように見受けられます。つまりは、
  /\
 /\
/\
N
 /\
/\
N

/\
N

Nothing
こう主張しているように思えるのです。短絡は起きていないように思えます。

ここで私のいう短絡とは、関数処理のスキップのみならず木構造の一発切除をも意味します
Nothingに出逢った瞬間全てを忘れて即Nothingです

これは無理なのでしょうか?

237:デフォルトの名無しさん
12/04/29 21:31:47.75
>>235
質問②
余談ですが考えてもみれば、左結合は(関数処理は省けても)そのまま最後まで構造が進むしか無いようで、
一方で右結合は構造も短絡できるかのように見えますが、
構造の最後の方でNothingが発生するか、結局最後まで発生しなかった場合を想像すると、
スタック巻き戻しを考慮に入れると、行って戻ることになり、
最後まで構造をなぞるどころかその2倍弱の手間になるかも知れませんね。

より最初の方でNothingが出る期待が高い時は右結合
そうでない時は安定的な左結合が適切なんでしょうか?

Data.List.and と or は右結合で定義されていますが
これは何を意識してのことでしょうか?

and/orの最後の方でFalse/Trueがでるか、あるいは最後まで出ない時、
(これは直感ですが)リストの半分を越えてから結論出せる状況になったら、
正格左結合よりも酷いパフォーマンスになるのではないでしょうか?

スタックを巻き戻すだけというのが、パターンマッチングで値を返す処理に比べて、
凄く速いのならそんな事は無いといえるのでしょうが。

238:デフォルトの名無しさん
12/04/29 22:32:05.06
木構造だとか関数処理とか怪しい概念は窓から放り投げて定義の展開と代入、簡約で考えよう
その辺はRWHよかIntroduction to Functional Programming using Haskellの方が詳しいyp

andやorが右結合なのは無限リスト食わせるとわかる
foldlで定義したら食わせるリストの頭に零因子であるものがあってもスタック食いつぶす

Maybeに関しての短絡はNothing >> forever (Just 1)とかするとわかる
これが木構造とやらを切除しないとなるとサイズが無限である木がメモリ上に存在してスタックオーバーフロー起こす事になる

239:デフォルトの名無しさん
12/04/29 23:59:04.07
初心者に信用されてないんだなあHaskell

240:デフォルトの名無しさん
12/04/30 03:31:17.36
手持ちの情報だけで突っ走ってしまう人がいるのはHaskellに限った話ではない

241:デフォルトの名無しさん
12/04/30 09:20:17.79
>>239
「信用」の意味がよく分らないです

Haskell は初心者から、本来あるべきどのような信用がないのでしょうか

242:デフォルトの名無しさん
12/04/30 09:55:23.07
>>214
くっそこんなので笑わされるとは

243:デフォルトの名無しさん
12/04/30 10:03:34.53
鳩丸

244:デフォルトの名無しさん
12/04/30 11:13:59.36
暗黙の型変換の仕組みは Haskell では作れないのでしょうか(GHC の拡張機能なとで)

例えばリテラルからの暗黙の型変換は一部ありますよね
Num.fromInteger 関数とか IsString.fromString 関数を定義しておけば、
リテラル整数や文字列を適切な型にコンパイラが自動的に変換してくれる
(後者は GHC の拡張機能ですが)

これの延長で、例えば OpenGL を使っていて、
GLdouble 型を引数に取る関数を Double 型に適用しようとした時、
何か特別な定義をしておけば、realToFrac 関数を使わずとも、
コンパイラが自動的に変換してくれるとか

このような例だけでなく、一般的に fromIntegral 関数とか realToFrac 関数って、
けっこう目障りなんですよね

これらって、型推論出来るようにコードを書かなければならないという、
どちらかと言うと言語仕様よりの概念じゃないですか
そのわりに、realToFrac 関数だけでは、ぱっと見、何から何への変換か分らない

一方で、これらの関数が使われているコードは、
何を計算するのかという、もっと抽象度の高い概念をコード化しているわけで

抽象度の高いコードの中に、抽象度の低い「おまじない」の様なコードが
けっこう大きな石ころのように混ざっている状況が、なんとも違和感を覚える

どうにかならないものでしょうか

245:デフォルトの名無しさん
12/04/30 11:26:54.17
>>241
うーん、言語の設計者より自分の方が頭いいかもしんない、と思われちゃってるところ。

246:デフォルトの名無しさん
12/04/30 11:45:17.37
どうでもいいレスに反応して戦線を拡大したがるあたり
抽象度とか言いつつ全体が見えていない

247:デフォルトの名無しさん
12/04/30 11:57:23.83
>>238
有難うございました(´;ω;)

248:デフォルトの名無しさん
12/04/30 14:53:15.43
GHCiで入力に関して、重複する履歴は考慮しないようにするにはどうしますか?
上を押しても同じ履歴だった場合、動いてないように見えてストレスとなります

249:デフォルトの名無しさん
12/04/30 15:06:17.22
>>248
残念ながら現状ではどうにもならない

なにかストレスを発散する方法を考えてくれ

250:デフォルトの名無しさん
12/04/30 15:30:36.77
サンクスエニウェイ

251:デフォルトの名無しさん
12/04/30 18:34:46.96
haskelineを直してパッチ送ればいいんじゃね

252:デフォルトの名無しさん
12/04/30 18:36:44.31
むしろこのスレの初心者の扱いの酷さに引いた

253:デフォルトの名無しさん
12/04/30 18:38:36.11
定番の頭の悪い攻撃ですな

254:デフォルトの名無しさん
12/04/30 23:24:32.16
初心者質問スレはまだ不要?

255:デフォルトの名無しさん
12/04/30 23:33:00.05
今まで初心者らしい素朴な質問を見たことがない

・どうやってボタン表示するんですか
・ループが出来ません
・変数変えれないんですけど

そんな質問しねーよ、って人ならもう初心者じゃない

具体的に「Haskellでやりたいこと」を見つけて取り組んでくれ
分かんないことがあったらピンポイントで質問してこい
あたしらが優しく相手してやる

256:デフォルトの名無しさん
12/05/01 00:09:38.80
HappyのGLR機能が保守放棄されている(現行のghcで動かない。バグもあるらしい)のですが、
今生きているHaskellのGLRパーサはありませんか?

257:デフォルトの名無しさん
12/05/01 03:16:34.46
>>255
お、お前……女だったのか……。

258:デフォルトの名無しさん
12/05/01 03:22:27.79
Haskellでメタプログラミングしたいんですけど,
具体的には今あるコード資産に対してコード変換して,機能拡張したい,
そのための便利な仕組みない

259:デフォルトの名無しさん
12/05/01 04:32:54.50
>>252
いんや?
自分が初心者の頃、親切に教えてもらったぞ?

プログラミングHaskellで最初に詰まって、散々悩んだreplicateのリスト内包表記版を作れって問題とか

初心者でも、replicateの再起版はすぐに思いついたんだが、この頃は本当に頭が固かったな・・・
(ヒントがlengthのリスト内包表記版の応用って書かれてても、全然思い浮かばんかった)

回答してもらって、ああ、なるほど、lengthのリスト内包表記版の応用だ。ってやっと納得できたっけ

そもそもHaskellはRubyとかと違って、組込み関数も自分で簡単に作れるってのが初心者の頃の自分には言語の理解の助けになった
普段自分の使ってる関数の動きを自分で同じ関数作って確認しながら覚えられるから、あんまり基本的過ぎる質問ってする必要が無かったし、
>>255同様、初心者らしい質問って、そもそもHaskell(または関数型言語)ってどんな言語?とか以外じゃ見ない(それも最初のスレだけだったような・・・)
当時の自分の質問が一番初心者らしい質問だったと思う


260:デフォルトの名無しさん
12/05/01 06:00:09.93
[(x,y) | x <- [1..], y <- [1..], 3^x - 2^y == 1]

深さ優先探索なので,(1,1)の後は事実上フリーズします

これを深さも幅も均衡して広げて探索していくにはどうしますか?

261:デフォルトの名無しさん
12/05/01 06:38:12.34
>>260
[(x,y) | x <- [1..], y <- [1..x], 3^x - 2^y == 1 ||  3^y - 2^x == 1]

262:デフォルトの名無しさん
12/05/01 08:47:38.24
>>259
昔のことは知ってるよ。Part3くらいから居る
>>231を馬鹿にする流れを見て、正気か?と思っただけ

263:デフォルトの名無しさん
12/05/01 09:44:02.40
馬鹿にしてるってどの辺が?

264:デフォルトの名無しさん
12/05/01 15:45:08.13
>>261
面白いハックです
ありがとうございました

265:デフォルトの名無しさん
12/05/02 16:26:57.40
無限モナドリストを受けて
条件を満たす最初の要素を束縛するにはどうしますか?

266:デフォルトの名無しさん
12/05/02 17:20:16.04
モナドリストって何?
[a] ?
Monad m => m [a] ?
Monad m => [m a] ?

基本はData.List.find (:: (a -> Bool) -> [a] -> Maybe a)と同じで、型に合わせてliftMしたりすればいいと思うよ。
ただ無限リストなので、条件を満たす要素がなかったら計算が終わらない。
これはしょうがない。

267:デフォルトの名無しさん
12/05/02 21:56:17.29
>>266
後者です

findでやってみようと思ったんですが
術語が Int -> IO Bool なんです

filterM みたいに findM があればいいと思いますが

filterMしてheadって不格好です
きっとスマートな解決法がある筈です

268:デフォルトの名無しさん
12/05/02 22:03:05.12
ああそれからモナドの性質上
無限のモナドのリストを渡すとフリーズしますよね

最初、遅延評価なのになんで正格評価みたいになってんだと首を傾げたのですが
考えてもみれば、順序を保証するんだからfilterMに無限のモナドのリストを渡すと
そのリストの最後の評価が済むまで次の行けないですよね
困りました

269:デフォルトの名無しさん
12/05/02 22:20:28.35
>=> 地味に便利ワロタ

270:デフォルトの名無しさん
12/05/02 22:54:51.28
[IO a] じゃなくて IO [a] で [a] が無限リストなら
どうもならん、諦めろ

271:デフォルトの名無しさん
12/05/02 23:45:26.55
[IO a]で無限です

272:デフォルトの名無しさん
12/05/03 00:06:04.51
Data.Listでの実装は
find p = listToMaybe . filter p
だぞ。別に filterM して head も似たようなもんじゃないか?

[IO a]でもIO [a]でも無限リストで要素が無ければ止まらないのは
一緒だと思う。

273:デフォルトの名無しさん
12/05/03 00:27:44.81
>>272
はい(´・ω・`)

274:デフォルトの名無しさん
12/05/03 00:29:59.11
filterM して head ってのはこれ?
これは要素があっても[IO a]が無限リストなら停止しないよ

findM' :: Monad m => (c -> m Bool) -> [m c] -> m c
findM' f = head <=< filterM (join . liftM f)


一方、こっちは要素があれば止まる(無ければ止まらない)

findM :: Monad m => (a -> m Bool) -> [m a] -> m (Maybe a)
findM f [] = return Nothing
findM f (x:xs) = do
  v <- x
  t <- f v
  if t then return $ Just v else findM f xs


テストしてみれば分かる

ms :: [IO Int]
ms = map return [1..]

main = do
  --print =<< findM' (return . (> 10)) ms
  print =<< findM (return . (> 10)) ms

275:デフォルトの名無しさん
12/05/03 05:20:09.91
ほんとですね
無限リストでfilterMは危険なのか。

276:デフォルトの名無しさん
12/05/03 06:33:35.38
>>274
ありがとうございました

filterMに倣って
findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)
版を作って使ってみましたが、何だかソースが汚れた気がします

Maybeを取扱う為に一々letやcaseを挿入しないとならなくなったせいでしょうね

しょうがないでしょうが

ところで何故標準ライブラリに採択されてないのでしょうか

277:デフォルトの名無しさん
12/05/03 06:38:59.61
>>276
無限リストに使うなら、停止するとき返り値は
必ずJust xなんだからfromJustで取り出せば?

278:デフォルトの名無しさん
12/05/03 06:46:35.74
join . liftM :: (r -> r) -> r -> r

これ何の使い道あるんですか?

279:デフォルトの名無しさん
12/05/03 06:57:09.58
>>277
そうでした。。。

コードが汚くなったのは別の改変のせいでした
勘違いして findM 導入のせいにしてました

280:デフォルトの名無しさん
12/05/03 07:10:28.79
>>278
なんの意味もない
liftM使って……て書き込み見たんでliftMから書き始めたからそうなった
今は反省している

281:デフォルトの名無しさん
12/05/03 07:26:28.96
Oh...

282:デフォルトの名無しさん
12/05/03 10:41:16.52
join . liftM p は p :: a -> m Bool を m a -> m b にするのに必要だけど、(>>= p) でも同じ。

283:デフォルトの名無しさん
12/05/03 11:17:28.41
せっかくの話の流れをぶった切って申し訳ないですが、質問します。

正格性フラグの付いたデータ型のことですが、

data X = X !Int
・・・
let x = X a

この場合、x の値が実際に必要になるかどうかに関わらず、
X a の a が評価されるという意味でしょうか。

もうひとつ、

data F = F !(Int -> Int)
・・・
let f = F g

この場合、g が評価されたというのは、どういう状態を指すのでしょうか。
と言うのも、関数ではない値なら弱頭部正規形になるまで評価され、
それがどういった形なのか頭の中にイメージ出来るのですが、
関数の評価という意味がいまひとつイメージ出来ません。

もしかして、g w = if v then 関数1 else 関数2 などと場合分けされていた場合に、
f = F g の時点でこの v まで評価されて関数1か関数2かが決定されるということであり、
単に g w = 2+w などという関数であれば正格性フラグを付ける意味はない、
ということでしょうか。

284:デフォルトの名無しさん
12/05/04 01:11:25.25
>>283
どちらの質問もその考え方であってる。


ただ、わかってるかもしれないけど、

>単に g w = 2+w などという関数であれば正格性フラグを付ける意味はない

束縛された値が正規形なのかとか、リテラルかどうかとか判断する術は一般にないから、
それらを基に正格性フラグ付けることに、意味がある、ないを判断することはできないし、意味もないよ。

重要なのは、値なりデータ構造なりがどこで構築されて、どこで正規化された値が必要になるのか?


285:デフォルトの名無しさん
12/05/04 01:24:42.23
Haskellの道は長く険しい

286:デフォルトの名無しさん
12/05/04 05:16:54.30
なら、やめれば?
言語は道具なんだから、習得に時間や労力が必要なら
その言語は道具として劣っているんだよ。

287:デフォルトの名無しさん
12/05/04 05:52:35.82
つまり習得に時間がかかる日本語や英語は猿のうなり声より劣っていると

288:デフォルトの名無しさん
12/05/04 06:47:05.76
>>283
> この場合、x の値が実際に必要になるかどうかに関わらず、
> X a の a が評価されるという意味でしょうか。
いや、xの値が必要になるまでは評価されない。

> もしかして、g w = if v then 関数1 else 関数2 などと場合分けされていた場合に、
> f = F g の時点でこの v まで評価されて関数1か関数2かが決定されるということであり、
同上。

> 単に g w = 2+w などという関数であれば正格性フラグを付ける意味はない、
> ということでしょうか。
これはそのとおり。

289:デフォルトの名無しさん
12/05/05 03:45:27.77
forM [1..9] print
1
2
:
9
[(),(),(),(),(),(),(),(),()]

この最後のゴミを排除するには
>> return ()
をバインドするのが正統ですか?

290:デフォルトの名無しさん
12/05/05 03:47:18.16
forM_

291:デフォルトの名無しさん
12/05/05 07:28:01.11
あざっす^^

292:デフォルトの名無しさん
12/05/05 13:36:55.17
>>286
C++を窓から放り投げるスレじゃないから

293:デフォルトの名無しさん
12/05/05 22:21:06.18
もしかして、main の中で一行でも IO がつくコードを書いたら、それ以降は絶対に IO は取れないのでしょうか?

294:283
12/05/05 23:04:46.88
お二人とも、ありがとうございます。

・・・結局、data X = X !Int の正規化フラグを付けるのと付けないのとで、
何が変わるのでしょうか?

data X = X !Int
・・・
let x = X a

>>284
> どちらの質問もその考え方であってる。

>>288
> いや、xの値が必要になるまでは評価されない。

どちらが正解なんですか。
それとも、お二方も同じ事を言っているのでしょうか。

a の評価のタイミングはいつなんでしょう?


>>284
> 束縛された値が正規形なのかとか、リテラルかどうかとか判断する術は一般にないから、
> それらを基に正格性フラグ付けることに、意味がある、ないを判断することはできないし、意味もないよ。

たしかに。
いや、ライブラリのソースを読んでいて、正規化フラグ付きの関数を持ったデータ型があって、
どういう意図・狙いでフラグを付けたのかなと思いました。

295:デフォルトの名無しさん
12/05/06 02:26:01.72
>>293
main に限らず何かの関数の中で IO を使う関数を利用すれば、その関数の型の出力の部分には絶対に IO が付くという意味なら、 IO は取れない
例外は Debug

もしかして、なにか方法あるのかな?


296:デフォルトの名無しさん
12/05/06 06:18:40.65
>>294
trace付けて確認すればいいやん。

import Debug.Trace

data X = X !Int
data Y = Y Int

main = do
 let x = X (trace "X" 1)
 let y = Y (trace "Y" 2)
 print 3
 print $ seq x 4
 print $ seq y 5

297:デフォルトの名無しさん
12/05/06 11:10:33.37
UnicodeSyntax きもいわー
Scala でもこういうの流行ってるようだし

298:デフォルトの名無しさん
12/05/06 11:19:04.33
さぁその気持ちでAgdaのコードを読もうか

299:デフォルトの名無しさん
12/05/06 12:16:00.88
新人が全角スペースを埋め込んでも怒られない時代

300:デフォルトの名無しさん
12/05/06 12:17:22.58
>>295
一応、標準ライブラリ内に System.IO.Unsafe.unsafePerformIO :: IO a -> a 関数がある

が、これは Simon Marlow と Simon Peyton-Jones の2人以外使ってはいけない

301:デフォルトの名無しさん
12/05/06 15:11:42.01
unsafePerformIO ……それは禁断の果実

302:デフォルトの名無しさん
12/05/08 22:24:51.66
尼のレビュー見てる限りだと、日本語で出てる入門書では
Graham Hutton著・山本和彦訳の「プログラミングHaskell」がいいっぽいけど、実際どうなの?

303:デフォルトの名無しさん
12/05/08 22:27:58.33
実際そう
対抗馬になりそうなのが今月出る「すごいHaskellたのしく学ぼう」

304:デフォルトの名無しさん
12/05/08 22:32:20.78
ゆっくり勉強する時間があるなら、いきなりRWHでいいと思う

305:デフォルトの名無しさん
12/05/09 00:22:24.17
プログラミングHaskellは8章以降が魔窟

306:デフォルトの名無しさん
12/05/09 00:38:56.55
魔窟ってほどではないけどあそこから難易度がすこーんと上がるのは確か
ゾウさん本にはその辺期待してる

307:デフォルトの名無しさん
12/05/09 00:52:04.11
じっくりやるならAlgebra of ProgrammingとかPurely Functional Data Structureみたいな応用の効く(範囲が広すぎて実はあまり役に立たない)内容をですね

308:デフォルトの名無しさん
12/05/09 01:06:20.12
ゾウ本だとHadoopと紛らわしいから愛称が欲しいな
寿司本?


309:デフォルトの名無しさん
12/05/09 01:12:32.86
スゴイ級

310:デフォルトの名無しさん
12/05/09 01:19:18.62
スシボンって書くとセシボンみたいで原題と繋がっていい感じだな
いやなんとなく

311:デフォルトの名無しさん
12/05/09 01:22:38.35
難しいことを簡単に書くのは無理。

312:デフォルトの名無しさん
12/05/09 03:25:04.44
すごハスは11章からが面白い

313:デフォルトの名無しさん
12/05/09 07:14:00.90
すごハスって、基本的にネットで無料で読める原著と内容はほぼ同じ?
それとも、大幅に加筆されてる?

314:デフォルトの名無しさん
12/05/09 08:22:56.77
Real World Haskell P.209に、

fnmatch :: (RegexLike Regex source1) => String -> source1 -> Bool

というのがあります。

ここの(RegexLike Regex source1)というクラス制約にある、A B a という形は
どのようなクラス宣言をすれば、このような形になるのでしょうか?

315:デフォルトの名無しさん
12/05/09 11:56:14.66
ソース読んでみそ。
URLリンク(hackage.haskell.org)

多変数型クラスを宣言するにはMultiParamTypeClassesというLANGUAGEプラグマが必要。
URLリンク(www.kotha.net)
また、多変数型クラスを含む型推論のために、多くの場合、関数従属または関連型が使われる。
URLリンク(www.kotha.net)
URLリンク(www.kotha.net)

316:デフォルトの名無しさん
12/05/09 11:57:01.10
ソース読んでみそ。
URLリンク(hackage.haskell.org)

多変数型クラスを宣言するにはMultiParamTypeClassesというLANGUAGEプラグマが必要。
URLリンク(www.kotha.net)
また、多変数型クラスを含む型推論のために、多くの場合、関数従属または関連型が使われる。
URLリンク(www.kotha.net)
URLリンク(www.kotha.net)

317:デフォルトの名無しさん
12/05/09 11:59:11.96
しまった。ダブりすまん。
ついでに訂正しておくと、多変数型クラスより多引数型クラスのほうが訳語として一般的みたいだ。

318:デフォルトの名無しさん
12/05/09 12:45:02.58
>>315


何故か、hackage.haskell.orgにつながらなくてソースは見られないのですが、
MultiParamTypeClassesというLANGUAGEプラグマをつければ、class宣言に複数の変数を
取ることができるんですね。

319:デフォルトの名無しさん
12/05/11 09:10:35.85
fact 0 = 1
fact n = n * fact (n - 1)
ふと思ったのですが、もし(階乗を知らない人が)負数を突っ込んだら死にますよね。
階乗は例えがアレですけどこういうケースのように、パターンマッチで任意の条件分岐(n < 0とか)できますか?

320:デフォルトの名無しさん
12/05/11 09:16:44.54
直接パターンマッチではできない
if-then-else式を使って、やりたいことはできる、と思う

321:デフォルトの名無しさん
12/05/11 09:17:54.53
あーあと、正しくない結果の時のエラーはundefinedという関数を呼ぶと、
エラーが起きる値が返るから、それを使えばいい

322:デフォルトの名無しさん
12/05/11 09:36:25.12
if-then-elseよかguardの方がよく見る

323:デフォルトの名無しさん
12/05/11 09:41:06.61
ありがとうございます。ガードの方が意味的に良さそうですね。

fact :: Int -> Int
fact (n)
  | (n < 0)  = undefined
  | (n == 0) = 1
  | (n >= 1) = n * fact (n - 1)

324:デフォルトの名無しさん
12/05/11 10:17:08.88
見やすさではそんな感じかな。こだわる人だとこう書くかも
fact n =
 case n `compare` 0 of
  LT -> undefined
  EQ -> 1
  GT -> n * fact (n - 1)

325:デフォルトの名無しさん
12/05/11 10:46:13.79
なるほどcaseならパターンの網羅性もチェックできる訳ですね。

326:デフォルトの名無しさん
12/05/11 10:51:34.61
自分の好みではこう。パターンマッチの上から順に、特殊ケース→一般とする。
fact n | n<0 = undefined
fact 0 = 1
fact n = n * fact (n-1)

327:デフォルトの名無しさん
12/05/11 10:51:35.52
ドメインを広げ過ぎると、また停止性が保証できない問題は出てくるだろうけども。

328:デフォルトの名無しさん
12/05/11 11:11:11.43
URLリンク(www.amazon.co.jp)

どうしてこうなった…w

329:デフォルトの名無しさん
12/05/11 11:53:25.13
マイナスかどうかのチェックは最初だけでいい、とか言い出すとどうかな

330:デフォルトの名無しさん
12/05/11 15:47:59.33
factSafe = check (>= 0) fact

check p f n = if p n then f n else undefined

fact 0 = 1
fact n = n * fact (n-1)


331:デフォルトの名無しさん
12/05/11 16:13:00.23
わざわざドメイン定義するならMaybeで返そう

332:デフォルトの名無しさん
12/05/11 16:36:37.12
check p f n = if p n then return (f n) else Nothing

ドメインて何?

333:デフォルトの名無しさん
12/05/11 16:57:47.03
factSafe = 1 : zipWith (*) [1..] factSafe
fact n = factSafe !! n

334:デフォルトの名無しさん
12/05/11 17:33:59.09
>>332
定義域
例えば浮動小数点や有理数を渡した時に、
コンパイルエラーも含めて健全な定義になっているかということを言っていると思う。

335:デフォルトの名無しさん
12/05/11 17:39:05.80
fact = (map snd (iterate (succ . fst &&& uncurry (*)) (1, 1)) !!)


336:デフォルトの名無しさん
12/05/11 17:59:32.33
>>333>>335
初心者の私に解説してplz

337:デフォルトの名無しさん
12/05/11 20:24:45.91
>>334
それscanlでできるよ!
fact = (!! n) $ scanl (*) 1 [1..]

あと(!!)使ったらSafeじゃないだろ…

338:337
12/05/11 20:25:54.90
すまん
>>333 宛だった。

339:デフォルトの名無しさん
12/05/11 20:42:03.98
負数入れたらエラーになるけど停止はするな

340:デフォルトの名無しさん
12/05/11 21:31:34.77
意味論の上ではどちらも⊥という扱い

341:デフォルトの名無しさん
12/05/11 22:47:56.84
それにしても335は酷いポイントフリー症候群だな…。

342:デフォルトの名無しさん
12/05/11 22:59:19.96
ポイントフリーは酷くないが(1,1)がマジックナンバーになってるのが気になる

343:デフォルトの名無しさん
12/05/11 23:45:33.49
初心者レベルの質問かもしれませんが、
Haskellの組み込み関数と同等の機能を
練習のために実装してみると、組み込み
のものより桁違いに遅い事があります。
組み込みの方の実装を見るためには
どうしたらいいでしょうか?

344:デフォルトの名無しさん
12/05/12 01:17:34.23
hsファイルをそのままインタプリタで実行して遅いなら、hiファイルにした後で実行してみてはどうか


345:デフォルトの名無しさん
12/05/12 01:47:10.63
>>343
Hackageのリファレンスからソース落とせる。

baseパッケージなら↓の一番下
URLリンク(hackage.haskell.org)

大抵は各関数の横にsourceってリンクが付いててHTML化されたソースを見ることができる。(全てのコードが辿れるとは限らないけど)

ただまぁ、融合変換とか正格性評価とかアンボックス型とか、かなり上級な内容もてんこ盛り。
他の言語でもそうだけど、基本ライブラリほど難しいっていう…。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch