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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/01/21(月) 02:16:16.07
haskell.org
ttp://www.haskell.org/

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

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
0052デフォルトの名無しさん2013/02/06(水) 22:23:54.11
>>50はものすごく教科書的でいいね。

nthElementIs xs num = last . take num $ xs

俺ならこの質問されたらめんどくさいから一行でこう書くわ
駄目な大人になってしまった
0053デフォルトの名無しさん2013/02/06(水) 22:37:16.96
nthElementIs xs n = xs!!(n-1)
0054デフォルトの名無しさん2013/02/06(水) 22:41:13.31
>>53でFA
これ以外の正解はない
0055デフォルトの名無しさん2013/02/06(水) 22:46:36.68
明らかに学習目的なのに既存の関数を使って正解って…

あとインデックスは0から開始するように習慣づけるべきだと誰も指摘しないことに驚いた
0056デフォルトの名無しさん2013/02/06(水) 22:52:17.68
>>46
分離したというけど、無関係ではないよね
IOの中では関数を適用できるが、関数の中ではIOを実行できない、という関係
コールバック関数を自分でコールできないみたいな状況に似ている
0057デフォルトの名無しさん2013/02/06(水) 22:56:07.24
既存の関数使わないでどう答えろと
(==)も(<)も(>)も(!!)も、全部既存の関数だぞ
0058デフォルトの名無しさん2013/02/06(水) 23:20:28.47
monadだから分離されているというべきなのか。
IOの型修飾を外すには、(>>=)するしか無いから分離されているというか、、、
0059502013/02/06(水) 23:51:46.77
>>51
> エラー書くよりはMaybe使った方がやはりいいのでしょうか?
> 後、ガードとcaseの使い分けはあるのでしょうか?

すまん。自分も習いはじめでよくわからんとです。

>>52
教科書読んだばかりですから !!
一流のHaskellerになると関数合成ばしばし使うのですね。
自分、関数合成にまだ発想が行きません。

便乗質問ですが、ピリオドとダラーの使い分けなんですけど、
nthElementIs xs num = last . take num $ xs

nthElementIs xs num = last $ take num $ xs

nthElementIs xs num = last $ take num xs
も結果は同じなのですがどう使い分けてます ?

本来なら(引数の順番さ000え逆だったら、nthElementIs num xsだったら)
nthElementIs num = last . take num
って書きたかったのでしょうけど


>>55
> あとインデックスは0から開始するように習慣づけるべきだと誰も指摘しないことに驚いた

そうしなければいけない何らかの事情があるのかと思ってた
((!!)を使うといけないのもエラー処理のためとか今後の拡張とかの理由かと思ってた)
0060デフォルトの名無しさん2013/02/06(水) 23:55:00.06
>>57
「既存の(ほぼ答えそのものの)関数を使って…」って書いたら満足だったか?

ていうか、よく見たら思った以上に酷い回答ばっかだった

まず、「is」が付く名前は慣習的にBoolを返すものだから、「nthElement」か単に「nth」とすべき。

>>52はありえない
>>50
(nthElement [] n) がNothingを返すのはいいが、
(nthElement [1,2,3,4] -1) などは明らかにプログラミングエラーなのだからエラーにするべき。
(他の言語なら最後の要素を返すのも考えられるが)
そうしないと潜在的なバグがコードに紛れ込み、かえって品質を落とすことになる。

入門書の最初の方に出てくるような例なんだから、これくらいまともに回答してくれよ
0061デフォルトの名無しさん2013/02/07(木) 00:37:35.34
人に文句言ってばかりで自分では何もしないカスがいるみたいだから、
俺が代わりにPreludeに載ってる!!の例から丸写ししてやる。

nthElement :: [a] -> Int -> a
nthElement xs n | n < 1 = error "nthElement: negative index"
nthElement [] _ = error "nthElement: index too large"
nthElement (x:_) 1 = x
nthElement (_:xs) n = nthElement xs (n - 1)
0062デフォルトの名無しさん2013/02/07(木) 00:52:21.07
丸写しして気づいたけど、2chでの回答としては>>53が一番の正解で間違いないね
ほぼ答えそのものの関数があるならそれを示せばいいだけだ。わざわざ転記する必要ねーじゃん
0063デフォルトの名無しさん2013/02/07(木) 01:08:02.48
>>61
酷いと言われて悔しかったのはわかるが、実際にいちばんまともなコメントをしているのは自分だと思うぞ。
名前から「Is」を削ったのは納得したからじゃないの?
(インデックスをわざわざ1から開始にするのは意味がわからないが…)

>>62
それなら答えは(!!)を使えということだろ。
あるいはソースへのリンクを貼るか
http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.6.0.1/src/GHC-List.html#%21%21
0064デフォルトの名無しさん2013/02/07(木) 01:17:45.78
病院池
0065デフォルトの名無しさん2013/02/07(木) 01:27:36.33
>実際にいちばんまともなコメントをしているのは自分だと思う
実際に一番まともなコメントは>>63以外にないと思うぞ。マジで。
名前は突っ込まれたから変えたけど正直問題の本質と関係ないからどうでもいいし

>インデックスをわざわざ1から開始にするのは意味がわからない
問題読み直したら?

>それなら答えは(!!)を使えということだろ。
だからそれが>>63で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、
ソースのリンクなんか貼らなくてもPreludeのソースなんてド素人でも見つけられる。
0066デフォルトの名無しさん2013/02/07(木) 01:28:48.39
安価ミス。>>63じゃなくて>>53

×実際に一番まともなコメントは>>63以外にないと思うぞ。
○実際に一番まともなコメントは>>53以外にないと思うぞ。

×だからそれが>>63で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、
○だからそれが>>53で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、
0067デフォルトの名無しさん2013/02/07(木) 01:31:57.55
>>62
あなたがそれを一番の正解と判断するに至った価値基準は?
それはあなた以外の人も持っていて当然のもの?
それ以外の価値基準が存在しうることは理解してる?
0068デフォルトの名無しさん2013/02/07(木) 06:04:09.76
なんかここ怖い
0069デフォルトの名無しさん2013/02/07(木) 07:11:57.30
基地外隔離スレだから仕方ない
0070デフォルトの名無しさん2013/02/07(木) 07:26:24.38
>>65,66
なんでそんなに切れてるわけ?
>>47を見れば初学者なのは一目瞭然なんだから、インデックスは0から始めるものだと教えてやるのは当然だし、
どう考えても争うような本質的な問題じゃないだろ?

> ソースのリンクなんか貼らなくてもPreludeのソースなんてド素人でも見つけられる。
リンクを貼るの難しそうだしね。無理言って悪かったよ。
0071デフォルトの名無しさん2013/02/07(木) 07:26:39.08
Haskell怖いです(震え声)
0072デフォルトの名無しさん2013/02/07(木) 07:30:47.90
Haskellは怖くないよ
>>47とかたぶんFizzBuzz並に簡単な問題
それさえもできない人が何故か回答してるからおかしくなってるだけで
0073デフォルトの名無しさん2013/02/07(木) 07:55:12.22
nth elementの取り出しなんて、preludeのソース詠めばいいだろ
0074デフォルトの名無しさん2013/02/07(木) 08:30:01.16
どうみても頭がおかしいのは>>60ひとり
0075デフォルトの名無しさん2013/02/07(木) 10:25:36.22
入門書読んだ後は、!!とか自作して遊んでたな。。。(遠い目)
0076デフォルトの名無しさん2013/02/07(木) 18:35:12.00
プログラミングhaskell
8章まで来たけど、いよいよ全く意味がわからなくなって挫折しそうボスケテ!
0077デフォルトの名無しさん2013/02/07(木) 19:13:34.93
8章は載ってるコードじゃ動かないし、その後の章の知識が必要だから初見で理解するのはたぶん無理だろう
理解できると一番面白い章だけど、最初は適当に読み流した方がいい
0078デフォルトの名無しさん2013/02/07(木) 20:39:42.42
8章から難易度がスコーンと上がるからな
すごいHの方に浮気するのもアリだと思う
0079デフォルトの名無しさん2013/02/07(木) 21:16:21.92
個人的にはすごいHaskellの方が難しいと思う
とくに序盤は
0080デフォルトの名無しさん2013/02/08(金) 01:55:53.33
RWHで挫折してまたRWHに戻ってくるまでが勉強です
0081デフォルトの名無しさん2013/02/08(金) 13:22:59.19
dammy
0082デフォルトの名無しさん2013/02/09(土) 12:25:40.88
>>77
8章はPreludeのdo,returnとかが邪魔してコード通り動かないよなw
とりあえずdo表記を使わず、Preludeにある関数は名前を変えて
なんとか練習問題まで終わらせたけど・・・。

9章の電卓も期待した動きと違う。主に遅延評価のせいだと思うけど。
入力した式が評価されるまでputStrの実行も遅延させられるみたいで、
電卓のテンキー(飾り)が表示されない・・・。

俺は練習問題に関してはここで心が折れたw

本文は、10章まで読んだけど、11章からは応用問題みたいだから
後でいいやと読むのを止めたw
0083デフォルトの名無しさん2013/02/09(土) 18:22:47.83
Haskellの最初の挫折ポイントはモナド
次の挫折ポイントが値の直接変更はSTモナド内で引きこもってやるということ

次の挫折ポイントがモナド変換
0084デフォルトの名無しさん2013/02/09(土) 19:15:19.99
モナドって、"最初の"挫折ポイントか?
私は、まだモナド山に入山してさえいない。その前でちょっと挫折気味。

今、プログラミングHaskell 13章を読んでいる最中。

すごいHaskellはアダプティブファンクターのところで止まっている。

プログラミングHaskell を読み終わったら、すごいHaskellのアダプティブファンクター
〜モナドのところに進んでみる。
0085デフォルトの名無しさん2013/02/09(土) 19:19:40.65
adaptive functor!
0086デフォルトの名無しさん2013/02/09(土) 20:58:26.45
>アダプティブファンクター
挫折した感がものすごく良く伝わってくる
0087デフォルトの名無しさん2013/02/09(土) 21:32:25.92
挫折ポイントはいっぱいある。
型クラス、型構築子、データ構築子などの独特な型の世界が
行く手を阻んでいる。
ついでに型でエラーが出まくって慣れないと
何のエラーかよくわからんのがなぁ。
0088デフォルトの名無しさん2013/02/10(日) 06:36:10.45
走り出してからエラーになるくらいならコンパイル通らない方が正義
0089デフォルトの名無しさん2013/02/10(日) 08:50:54.19
俺も正義だと思うが、それとエラーメッセージが分かりづらいのは別の話
0090デフォルトの名無しさん2013/02/11(月) 01:41:11.39
コンパイラがプログラマの意図を読めない限り
ありのままに起こった事を言うしかない
何を言ってるか分からないと思うが
0091デフォルトの名無しさん2013/02/11(月) 03:00:26.98
それとエラーメッセージが分かりづらいのは別の話
0092デフォルトの名無しさん2013/02/11(月) 09:28:40.81
Haskell(GHC)で最も意味不明のエラー in 俺

* is a rigid type variable bound by 〜
0093デフォルトの名無しさん2013/02/11(月) 10:59:30.81
data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
deriving (Eq, Show)
fromDayToNum :: Day -> Int
fromDayToNum day = case (day) of
Mon-> 0
Tue -> 1
Wed -> 2
Thu -> 3
Fri -> 4
Sat -> 5
Sun -> 6
fromNumToDay :: Int -> Day
fromNumToDay number = case (number) of
0 -> Mon
1 -> Tue
2 -> Wed
3 -> Thu
4 -> Fri
5 -> Sat
6 -> Sun

isWorkDay :: Day -> Bool
isWorkDay day
| (fromDayToNum day >= 0 && fromDayToNum day <= 4) = True
| otherwise = False

isWorkDay' :: Day -> Bool
isWorkDay' day = case (day) of
(fromDayToNum day >= 0 && fromDayToNum day <= 4)-> True
_-> False
何故、isWorkDay' はfromDayToNumを使えないのでしょうか?
0094デフォルトの名無しさん2013/02/11(月) 11:26:59.76
>>93
case 中の -> の左側はパターンしか書けない
関数適用はパターンではないので、そういう使い方はできない

パターンは例をたくさん見ると理解がはやいと思う
直感的には構造で分岐する
0095デフォルトの名無しさん2013/02/11(月) 12:02:11.43
例を見るもなにも、パターンマッチには基本的にコンストラクタしか使えないってだけじゃないの?
一応例外的にリストは[]が使えるけど
0096デフォルトの名無しさん2013/02/11(月) 12:48:36.09
基本的にリテラルも使える
0097デフォルトの名無しさん2013/02/11(月) 13:58:43.34
[]が例外的? 意味ワカンネ
0098デフォルトの名無しさん2013/02/11(月) 14:03:16.68
基本的にn+kは消えた
0099デフォルトの名無しさん2013/02/11(月) 14:06:21.42
束縛した変数を使えるという思い込みがたまに発生してデバッグに時間がかかる
0100デフォルトの名無しさん2013/02/11(月) 14:30:09.01
>>97
空リストじゃなくて[]を使ったパターンのことね
[a, b]みたいなパターンも使えるけど、これはコンストラクタじゃないでしょ?
0101デフォルトの名無しさん2013/02/11(月) 14:33:49.34
Haskellはあくまで静的型付けなんだという事が
コンパイル時のストレスと
実行時のパフォーマンスをもたらす
0102デフォルトの名無しさん2013/02/11(月) 14:49:47.60
次の2つは同じだから、セマンティクス上はコンストラクタでパターンマッチさせて要素を変数にバインドしてる

f x = case x of
[a,b] -> b

g x = case x of
((:) a ((:) b [])) -> b

http://www.sampou.org/haskell/report-revised-j/exps.html#lists
http://www.sampou.org/haskell/report-revised-j/basic.html#basic-lists
0103デフォルトの名無しさん2013/02/11(月) 19:02:29.99
> ((:) a ((:) b [])) -> b

( ´;゚;ё;゚;) ←これに見えた
0104デフォルトの名無しさん2013/02/11(月) 20:05:23.50
なるほど、つまり関数適用はガードで。
それ以外はcaseで良いと?

riverse :: String -> String
riverse list = case (list) of
[] -> []
(x:xs) -> riverse xs ++ [x]
xRiverse :: String -> String -> Bool
xRiverse list rlist = case (list) of
[] -> if (rlist == [])
then True
else False
(x:xs) -> if (list == (riverse rlist))
then True
else False

では何故xRiverseの(list == (riverse rlist))は使えるのでしょうか?
0105デフォルトの名無しさん2013/02/11(月) 20:27:57.97
なぜも糞もねーだろ
もう一回入門書読み直してこい
0106デフォルトの名無しさん2013/02/11(月) 20:28:33.77
>>104
if e1 then e2 else e3
という形のとき e1 はBool の式なら何でもいい
list == (riverse rlist) は Bool の式なので使える
式っていうのは、どんどん計算することができて、途中に関数適用があったら実際に適応して計算を継続していく
そして、どんどん計算した結果、(Boolの式なので)TrueかFalseになる
もしTrueならif全体が e2 に、Falseなら e3 になる
0107デフォルトの名無しさん2013/02/11(月) 20:31:24.19
ポインタ同値性を判定する方法ってなんかない?
0108デフォルトの名無しさん2013/02/11(月) 20:45:26.08
ポインタアナリシス
0109デフォルトの名無しさん2013/02/11(月) 20:54:35.49
>>105~106
丁寧な説明ありがとうございます。
今ちょうど入門書を読んでいる所だったので。
ありがとうございました。
0110デフォルトの名無しさん2013/02/12(火) 06:54:40.32
>>107
おまえが入門者なら、答えは「ない」
そうでないなら、ポインタ同値性で何をやりたいかによる
0111デフォルトの名無しさん2013/02/12(火) 06:56:54.59
引数を1つ取って、引数の型シノニムを文字列として返す関数ってどういう風にやればいいの?
0112デフォルトの名無しさん2013/02/12(火) 07:00:32.14
>引数の型シノニム
って何?
引数の型を文字列として返したいなら、

import Data.Typeable

typeName :: (Typeable a) => a -> String
typeName = show . typeOf
0113デフォルトの名無しさん2013/02/12(火) 07:19:50.40
>>112
引数の型を返して欲しいけど、型に別名つけたときに別名が返って欲しいという意味で型シノニムと言ってみた。

型が返るだけでも十分だ。ありがとう。
0114デフォルトの名無しさん2013/02/12(火) 17:59:38.15
JavaやC#のインターフェースはクラスにある約束事(メソッドなど)の実装を強いることにより、その約束事を前提にロジックを書くことができると思いますが、
同時に、その約束事を実装しているものであれば実行時にそのロジックにどんなオブジェクトでも渡せるという仕組みでもあると思います。例えばUIの何らかのコントロールが渡されてきてDrawメソッドが呼ばれるような。

Haskellの型クラスはある約束事を想定するという意味では似ていると思いますが、コンパイル時に呼ばれるものが解決されて実行時にその約束事を守るどんなものでも渡せるというものではないですよね?

Haskellの場合は上にあげたような何らかのコントロールを渡して何らかの処理をするような処理というのはどんなふうに書くもんでしょうか?
0115デフォルトの名無しさん2013/02/12(火) 19:13:43.92
何言ってるんだかわからん
0116デフォルトの名無しさん2013/02/12(火) 19:40:23.91
>>114
例えば (>>) :: Monad m => m a -> m b -> m b。
これは、Monad 型クラスのインスタンス型であれば
どのような型の値でも被演算子になれる(引数として適用できる)のだが、
このようなものでは不満か?

ただ、この場合は m a 型引数 と m b 型引数は
Monad 型クラスの同じインスタンス型でなければならないがな。

f :: (Monad m, Monad n) => m a -> n b -> m a
とかなら Monad 型クラスの違うインスタンス型の値が引数になれる。

> Haskellの場合は上にあげたような何らかのコントロールを渡して何らかの処理をするような処理というのはどんなふうに書くもんでしょうか?

何らかの型クラスのインスタンス型の値を渡したり、関数を渡したり、
関数内でパースされ解釈・計算される何らかの値(計算式を表したツリーとか)を渡す、など。
0117デフォルトの名無しさん2013/02/12(火) 20:18:33.90
>>114
ExistentialQuantification拡張を使えば、型クラスをOOPのインターフェースのように使ってオブジェクト指向の多態っぽいことが出来る
ttp://www.haskell.org/haskellwiki/Existential_type
0118デフォルトの名無しさん2013/02/12(火) 22:25:36.74
プログラミングHaskellなんとか読み終わった。
「本物のプログラマはHaskellを使う」の3章〜4章あたりを読んでいる最中。
モナドはまだ‥わけわからんが、とりあえず式を追うことまでは可になった。
0119デフォルトの名無しさん2013/02/13(水) 00:24:00.07
Haskell本って突然"->"とか説明もなく記号が出てくるの何とかならないのかって思う
初めて読んだとき->って何だよって本投げたわ
0120デフォルトの名無しさん2013/02/13(水) 00:45:42.76
説明は必要になるまで遅延されます
0121デフォルトの名無しさん2013/02/13(水) 07:14:39.41
質問です。
reverseList :: [a] -> [a]
reverseList list = case (list) of
[]-> []
(x:xs)-> reverseList xs ++ [x]

isPalindrome :: (Eq a) => [a] -> Bool
isPalindrome list
| (list == (reverseList list))= True
| otherwise= False
のisPalindromeは(Eq a)=>を入れないと(==)のテストが出来ないことが分かりました。しかし、
isSum :: [a] -> Int
isSum [] = 0
isSum (x:xs) = 1 + isSum xs    は (Num a) =>が無しでも動きます。
どう言う時に"()=>"を使用すればいいのしょうか?また、全ての関数にこの"()=>"を付けた方がよりいいのでしょうか?
0122デフォルトの名無しさん2013/02/13(水) 07:40:19.86
>>117
その2.2-2.3辺りの事ですね。
んーとこれはコンパイラのスイッチでこういう書き方を許容出来る様に出来るけどデフォルトでは出来ないってことですかね。デフォルトではその辺どうするんでしょう?
ray tracerの例で言ってるようなrendableであるヘテロジニアスなリストとして扱って、時にはその中でballのものだけごにょごにょするような。
通常は代数的データ型でやるんでしょうが、例えばUIフレームワークみたいなものを作るとしたらどうしても後からフレームワーク外で後から定義されたものも同じ様に扱うニーズが有るので代数的データ型は使えないだろうと。

>>116 自分が言いたかったのは>>117に有る様なヘテロジニアスなリストを元にdynamic dispatchするにはとなると思います。
書き方が足らなくてすいませんでした。
0123デフォルトの名無しさん2013/02/13(水) 08:36:54.73
型は良い事をするための物ではなく、悪い事を防ぐための免疫だよ
悪いやつが出てきてないのに何かしようとするのはアレルギーと同じ
アレルギーをなおすには型を弱くすればいいよ
0124デフォルトの名無しさん2013/02/13(水) 09:13:34.03
>>121
isSum 内の + は 型 a に関して足してるわけじゃないので (Num a) => という a に関する制約は不要
a にかかわらず要素の数を足している

コンパイルエラーになった時のように、必要なときに必要なだけ書けばいいと思うよ
0125デフォルトの名無しさん2013/02/13(水) 13:37:37.02
ありがとうございます。
きっちり型が制限されてないときだけ()=>を使います。

けど、どう言うときに「型がきっちり制限されている」のか分かるのでしょうか?[a]がElemとかShowとかが必要な時?
持ってる本(introduction to functional programming language using haskell)では良く分からなかったので。
0126デフォルトの名無しさん2013/02/13(水) 15:10:06.26
単相性制限ってまだ生きてる?
0127デフォルトの名無しさん2013/02/13(水) 18:42:19.23
windowsにhaskellをインストールしたら1GBも容量食った
何でこんなにでかいの?でかすぎやしないか?
0128デフォルトの名無しさん2013/02/13(水) 20:08:54.01
>>127
> 何でこんなにでかいの?

サブフォルダ一つ一つの容量を調べてみれば、
何が容量を食っているのか分かるだろ。
その「何が」が分かれば、「どうしてか」も
今よりはもっと良く推測できるだろ。

何故そんな簡単な努力を怠って質問してくる?
0129デフォルトの名無しさん2013/02/13(水) 20:13:01.85
それは簡単な努力じゃないだろ
0130デフォルトの名無しさん2013/02/13(水) 20:25:07.57
プロHaskeller様にとっては簡単なんだろ
0131デフォルトの名無しさん2013/02/13(水) 20:28:34.53
普通にエクスプローラーを開いてフォルダのプロパティを見れば良いだけだが

もちろん、フォルダのサイズを一覧できる Haskell プログラムを書いても良いが、
そこまでしなくても分かるだろ
0132デフォルトの名無しさん2013/02/13(水) 20:46:23.62
なんで食い下がるんだよw
さしたる瑕疵のない質問に対して恫喝的な態度を取ったのを非難されてるんだろ
0133デフォルトの名無しさん2013/02/13(水) 20:51:08.42
>>128
ハア?そんなの調べてどうすんの?アホなの?
0134デフォルトの名無しさん2013/02/13(水) 20:56:47.87
では、簡単な努力もしない教えて君には、
どのような態度をとれば良かったんだ?

俺は努力して調べろと言った。
調べる方法も示した。

これ以上の適切なレスはそうそう無いだろう。


>>133
調べれば、「何でこんなにでかいの?」という質問に対する答えを、
「自分で」より推測しやすくなる。
0135デフォルトの名無しさん2013/02/13(水) 20:58:47.41
>>134
だからさ、それを調べたところで何になるの?
0136デフォルトの名無しさん2013/02/13(水) 21:02:24.41
>>135
疑問を自分で解消するための糸口が得られる。
0137デフォルトの名無しさん2013/02/13(水) 21:03:33.46
いいぞもっとやれ
0138デフォルトの名無しさん2013/02/13(水) 21:05:12.84
>>137
何を? 何故?
0139デフォルトの名無しさん2013/02/13(水) 21:08:36.06
>>136
だからサイズが大きいファイルなどを調べてどうすんの?
開発者にもっと軽量してくださいってお願いするの?
さっきから的外れな話してんじゃねえよ
0140デフォルトの名無しさん2013/02/13(水) 21:15:40.81
>>139

>>127 が質問しているのはインストールしたHaskellの容量が1GBもある「理由」。
何に容量を食われているのか分かれば、そこから理由が推測できる。

(でかすぎやしないか?というのは、もっと小さくできないのかという思いを
疑問系で発言しただけのことだろうから無視)

もし >>127 が単なる愚痴であるなら、そもそも、そんなものはチラ裏にでも書いておけ
0141デフォルトの名無しさん2013/02/13(水) 21:21:54.04
これから数スレ以内に "アスペ" が含まれる確率80%
0142デフォルトの名無しさん2013/02/13(水) 21:25:17.78
http://stackoverflow.com/questions/4858585/why-is-ghc-so-large-big
0143デフォルトの名無しさん2013/02/13(水) 21:40:48.01
イイからとっととファイルの階層を容量やフォルダ名、フォルダの中身をZipper的に辿れるもんサクッと作れや( ´Д`)y━・~~
0144デフォルトの名無しさん2013/02/13(水) 22:01:35.75
なんでこんなにでかいの?

フォルダ見てみればいいじゃん

はあ?なんでそんなことしなきゃいけないんだよ
0145デフォルトの名無しさん2013/02/13(水) 22:16:34.62
>>144
悪意を感じるな。
意図的に省略したか?

なんでこんなにでかいの?

フォルダのサイズを見れば「何が」でかいのか分かる
「何が」が分かれば「どうしてか」は今よりもより良く推測できる

はあ?なんでそんなことしなきゃいけないんだよ

だろうが。


単に、なんででかいんだよ、と言うだけで思考停止してるんじゃなくて、
自分でできるところまでまず調べろ。
容量をでかくしている主犯を調べるのはそのとっかかりだ。
その主犯がHaskellにどう関係してくるのか、
そいつは何故そんなにもでかいのか、
容量をでかくしているのはそいつだけなのか、これらを考えるのはその後だ。
0146デフォルトの名無しさん2013/02/13(水) 23:27:22.65
>>125
とりあえず、
isSum ['a', 'b', 'c']

3になるのはよろしいでしょうか ?

mySum [] = 0
mySum (x:xs) = x + mySum xs
の場合(Num a) => aという制約が必要になります。

なぜなら、+の部分を型で書くと a + Intとなります。
aがNumのインスタンス?でなければならないので
Num a => aという制約が必要になります。

isNumの場合そのようなものはなく+の両辺の型は
1 (<= Numのインスタンス?) + Intであり、aに関する制約はまったく必要ないので
制約に関する記述は必要なくなります。


これでいいのかな?
添削して

インスタンスって表現でいいんだっけ ?
0147デフォルトの名無しさん2013/02/13(水) 23:55:55.60
>>146
0 :: Num a => a
(+) :: Num a => a -> a -> a
やな
Intに限らない
0148デフォルトの名無しさん2013/02/14(木) 03:51:26.44
最近血痰と喘息の気があるな
アスペルギルスかな
0149デフォルトの名無しさん2013/02/14(木) 10:58:17.65
>>146
つまり、>>121のisPalindromeは相等性を持つ型(値が明確)と認識されなかったからダメだった。
だから、その式ではa==aがInt == Int、Bool == Bool、String==String なのか解らないが為に()=>の制約が必要?
制約って関数の型をもっと強めることも出きるような物って感じがします。
0150デフォルトの名無しさん2013/02/14(木) 13:13:38.62
型変数a, b, ...は制約ではなく写像って感じ
型変数に具体的な型を入れると何かが出てくる
入れる際に制約がもしあれば型クラスを指定する
01511462013/02/15(金) 00:48:04.33
>>149
ところでHaskellってList同士の比較も素でできるのすごいなぁ

で、
(==) [] lst = lst == []
(==) (x:xs) (y:ys) = (x == y) && (xs == ys)
だとして
x == yの部分が(Eq a) => a -> a -> Boolであるので
xの型は(Eq a) => aである必要があります。

IntもBoolもStringもEqのインスタンスなのですが、例えば
add1 x = x + 1
のadd1の型は(Num a => a -> a)(aをとりaを返す*関数*)となり
Eqのインスタンスではなく(==)の引数にすることができません。
(add1 == add1はエラーになる)

isPalindromeで(==)を使っている以上aはEqのインスタンスである
必要がある以上、引数がEqのインスタンスであることを要求する意味で
(Eqのインスタンスでない型の引数を拒絶する意味で)
Eq a => a
の制約が必要となります。


こんな感じ ?
■ このスレッドは過去ログ倉庫に格納されています