関数型プログラミング言語Haskell Part21
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/01/21(月) 02:16:16.07ttp://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.11nthElementIs xs num = last . take num $ xs
俺ならこの質問されたらめんどくさいから一行でこう書くわ
駄目な大人になってしまった
0053デフォルトの名無しさん
2013/02/06(水) 22:37:16.960054デフォルトの名無しさん
2013/02/06(水) 22:41:13.31これ以外の正解はない
0055デフォルトの名無しさん
2013/02/06(水) 22:46:36.68あとインデックスは0から開始するように習慣づけるべきだと誰も指摘しないことに驚いた
0056デフォルトの名無しさん
2013/02/06(水) 22:52:17.68分離したというけど、無関係ではないよね
IOの中では関数を適用できるが、関数の中ではIOを実行できない、という関係
コールバック関数を自分でコールできないみたいな状況に似ている
0057デフォルトの名無しさん
2013/02/06(水) 22:56:07.24(==)も(<)も(>)も(!!)も、全部既存の関数だぞ
0058デフォルトの名無しさん
2013/02/06(水) 23:20:28.47IOの型修飾を外すには、(>>=)するしか無いから分離されているというか、、、
005950
2013/02/06(水) 23:51:46.77> エラー書くよりは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「既存の(ほぼ答えそのものの)関数を使って…」って書いたら満足だったか?
ていうか、よく見たら思った以上に酷い回答ばっかだった
まず、「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ほぼ答えそのものの関数があるならそれを示せばいいだけだ。わざわざ転記する必要ねーじゃん
0063デフォルトの名無しさん
2013/02/07(木) 01:08:02.48酷いと言われて悔しかったのはわかるが、実際にいちばんまともなコメントをしているのは自分だと思うぞ。
名前から「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.780065デフォルトの名無しさん
2013/02/07(木) 01:27:36.33実際に一番まともなコメントは>>63以外にないと思うぞ。マジで。
名前は突っ込まれたから変えたけど正直問題の本質と関係ないからどうでもいいし
>インデックスをわざわざ1から開始にするのは意味がわからない
問題読み直したら?
>それなら答えは(!!)を使えということだろ。
だからそれが>>63で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、
ソースのリンクなんか貼らなくてもPreludeのソースなんてド素人でも見つけられる。
0066デフォルトの名無しさん
2013/02/07(木) 01:28:48.39×実際に一番まともなコメントは>>63以外にないと思うぞ。
○実際に一番まともなコメントは>>53以外にないと思うぞ。
×だからそれが>>63で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、
○だからそれが>>53で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、
0067デフォルトの名無しさん
2013/02/07(木) 01:31:57.55あなたがそれを一番の正解と判断するに至った価値基準は?
それはあなた以外の人も持っていて当然のもの?
それ以外の価値基準が存在しうることは理解してる?
0068デフォルトの名無しさん
2013/02/07(木) 06:04:09.760069デフォルトの名無しさん
2013/02/07(木) 07:11:57.300070デフォルトの名無しさん
2013/02/07(木) 07:26:24.38なんでそんなに切れてるわけ?
>>47を見れば初学者なのは一目瞭然なんだから、インデックスは0から始めるものだと教えてやるのは当然だし、
どう考えても争うような本質的な問題じゃないだろ?
> ソースのリンクなんか貼らなくてもPreludeのソースなんてド素人でも見つけられる。
リンクを貼るの難しそうだしね。無理言って悪かったよ。
0071デフォルトの名無しさん
2013/02/07(木) 07:26:39.080072デフォルトの名無しさん
2013/02/07(木) 07:30:47.90>>47とかたぶんFizzBuzz並に簡単な問題
それさえもできない人が何故か回答してるからおかしくなってるだけで
0073デフォルトの名無しさん
2013/02/07(木) 07:55:12.220074デフォルトの名無しさん
2013/02/07(木) 08:30:01.160075デフォルトの名無しさん
2013/02/07(木) 10:25:36.220076デフォルトの名無しさん
2013/02/07(木) 18:35:12.008章まで来たけど、いよいよ全く意味がわからなくなって挫折しそうボスケテ!
0077デフォルトの名無しさん
2013/02/07(木) 19:13:34.93理解できると一番面白い章だけど、最初は適当に読み流した方がいい
0078デフォルトの名無しさん
2013/02/07(木) 20:39:42.42すごいHの方に浮気するのもアリだと思う
0079デフォルトの名無しさん
2013/02/07(木) 21:16:21.92とくに序盤は
0080デフォルトの名無しさん
2013/02/08(金) 01:55:53.330081デフォルトの名無しさん
2013/02/08(金) 13:22:59.190082デフォルトの名無しさん
2013/02/09(土) 12:25:40.888章はPreludeのdo,returnとかが邪魔してコード通り動かないよなw
とりあえずdo表記を使わず、Preludeにある関数は名前を変えて
なんとか練習問題まで終わらせたけど・・・。
9章の電卓も期待した動きと違う。主に遅延評価のせいだと思うけど。
入力した式が評価されるまでputStrの実行も遅延させられるみたいで、
電卓のテンキー(飾り)が表示されない・・・。
俺は練習問題に関してはここで心が折れたw
本文は、10章まで読んだけど、11章からは応用問題みたいだから
後でいいやと読むのを止めたw
0083デフォルトの名無しさん
2013/02/09(土) 18:22:47.83次の挫折ポイントが値の直接変更はSTモナド内で引きこもってやるということ
次の挫折ポイントがモナド変換
0084デフォルトの名無しさん
2013/02/09(土) 19:15:19.99私は、まだモナド山に入山してさえいない。その前でちょっと挫折気味。
今、プログラミングHaskell 13章を読んでいる最中。
すごいHaskellはアダプティブファンクターのところで止まっている。
プログラミングHaskell を読み終わったら、すごいHaskellのアダプティブファンクター
〜モナドのところに進んでみる。
0085デフォルトの名無しさん
2013/02/09(土) 19:19:40.650086デフォルトの名無しさん
2013/02/09(土) 20:58:26.45挫折した感がものすごく良く伝わってくる
0087デフォルトの名無しさん
2013/02/09(土) 21:32:25.92型クラス、型構築子、データ構築子などの独特な型の世界が
行く手を阻んでいる。
ついでに型でエラーが出まくって慣れないと
何のエラーかよくわからんのがなぁ。
0088デフォルトの名無しさん
2013/02/10(日) 06:36:10.450089デフォルトの名無しさん
2013/02/10(日) 08:50:54.190090デフォルトの名無しさん
2013/02/11(月) 01:41:11.39ありのままに起こった事を言うしかない
何を言ってるか分からないと思うが
0091デフォルトの名無しさん
2013/02/11(月) 03:00:26.980092デフォルトの名無しさん
2013/02/11(月) 09:28:40.81* is a rigid type variable bound by 〜
0093デフォルトの名無しさん
2013/02/11(月) 10:59:30.81deriving (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.76case 中の -> の左側はパターンしか書けない
関数適用はパターンではないので、そういう使い方はできない
パターンは例をたくさん見ると理解がはやいと思う
直感的には構造で分岐する
0095デフォルトの名無しさん
2013/02/11(月) 12:02:11.43一応例外的にリストは[]が使えるけど
0096デフォルトの名無しさん
2013/02/11(月) 12:48:36.090097デフォルトの名無しさん
2013/02/11(月) 13:58:43.340098デフォルトの名無しさん
2013/02/11(月) 14:03:16.680099デフォルトの名無しさん
2013/02/11(月) 14:06:21.420100デフォルトの名無しさん
2013/02/11(月) 14:30:09.01空リストじゃなくて[]を使ったパターンのことね
[a, b]みたいなパターンも使えるけど、これはコンストラクタじゃないでしょ?
0101デフォルトの名無しさん
2013/02/11(月) 14:33:49.34コンパイル時のストレスと
実行時のパフォーマンスをもたらす
0102デフォルトの名無しさん
2013/02/11(月) 14:49:47.60f 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( ´;゚;ё;゚;) ←これに見えた
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.77if 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.190108デフォルトの名無しさん
2013/02/11(月) 20:45:26.080109デフォルトの名無しさん
2013/02/11(月) 20:54:35.49丁寧な説明ありがとうございます。
今ちょうど入門書を読んでいる所だったので。
ありがとうございました。
0110デフォルトの名無しさん
2013/02/12(火) 06:54:40.32おまえが入門者なら、答えは「ない」
そうでないなら、ポインタ同値性で何をやりたいかによる
0111デフォルトの名無しさん
2013/02/12(火) 06:56:54.590112デフォルトの名無しさん
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引数の型を返して欲しいけど、型に別名つけたときに別名が返って欲しいという意味で型シノニムと言ってみた。
型が返るだけでも十分だ。ありがとう。
0114デフォルトの名無しさん
2013/02/12(火) 17:59:38.15同時に、その約束事を実装しているものであれば実行時にそのロジックにどんなオブジェクトでも渡せるという仕組みでもあると思います。例えばUIの何らかのコントロールが渡されてきてDrawメソッドが呼ばれるような。
Haskellの型クラスはある約束事を想定するという意味では似ていると思いますが、コンパイル時に呼ばれるものが解決されて実行時にその約束事を守るどんなものでも渡せるというものではないですよね?
Haskellの場合は上にあげたような何らかのコントロールを渡して何らかの処理をするような処理というのはどんなふうに書くもんでしょうか?
0115デフォルトの名無しさん
2013/02/12(火) 19:13:43.920116デフォルトの名無しさん
2013/02/12(火) 19:40:23.91例えば (>>) :: 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.90ExistentialQuantification拡張を使えば、型クラスをOOPのインターフェースのように使ってオブジェクト指向の多態っぽいことが出来る
ttp://www.haskell.org/haskellwiki/Existential_type
0118デフォルトの名無しさん
2013/02/12(火) 22:25:36.74「本物のプログラマはHaskellを使う」の3章〜4章あたりを読んでいる最中。
モナドはまだ‥わけわからんが、とりあえず式を追うことまでは可になった。
0119デフォルトの名無しさん
2013/02/13(水) 00:24:00.07初めて読んだとき->って何だよって本投げたわ
0120デフォルトの名無しさん
2013/02/13(水) 00:45:42.760121デフォルトの名無しさん
2013/02/13(水) 07:14:39.41reverseList :: [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その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.03isSum 内の + は 型 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.260127デフォルトの名無しさん
2013/02/13(水) 18:42:19.23何でこんなにでかいの?でかすぎやしないか?
0128デフォルトの名無しさん
2013/02/13(水) 20:08:54.01> 何でこんなにでかいの?
サブフォルダ一つ一つの容量を調べてみれば、
何が容量を食っているのか分かるだろ。
その「何が」が分かれば、「どうしてか」も
今よりはもっと良く推測できるだろ。
何故そんな簡単な努力を怠って質問してくる?
0129デフォルトの名無しさん
2013/02/13(水) 20:13:01.850130デフォルトの名無しさん
2013/02/13(水) 20:25:07.570131デフォルトの名無しさん
2013/02/13(水) 20:28:34.53もちろん、フォルダのサイズを一覧できる Haskell プログラムを書いても良いが、
そこまでしなくても分かるだろ
0132デフォルトの名無しさん
2013/02/13(水) 20:46:23.62さしたる瑕疵のない質問に対して恫喝的な態度を取ったのを非難されてるんだろ
0133デフォルトの名無しさん
2013/02/13(水) 20:51:08.42ハア?そんなの調べてどうすんの?アホなの?
0134デフォルトの名無しさん
2013/02/13(水) 20:56:47.87どのような態度をとれば良かったんだ?
俺は努力して調べろと言った。
調べる方法も示した。
これ以上の適切なレスはそうそう無いだろう。
>>133
調べれば、「何でこんなにでかいの?」という質問に対する答えを、
「自分で」より推測しやすくなる。
0135デフォルトの名無しさん
2013/02/13(水) 20:58:47.41だからさ、それを調べたところで何になるの?
0136デフォルトの名無しさん
2013/02/13(水) 21:02:24.41疑問を自分で解消するための糸口が得られる。
0137デフォルトの名無しさん
2013/02/13(水) 21:03:33.460138デフォルトの名無しさん
2013/02/13(水) 21:05:12.84何を? 何故?
0139デフォルトの名無しさん
2013/02/13(水) 21:08:36.06だからサイズが大きいファイルなどを調べてどうすんの?
開発者にもっと軽量してくださいってお願いするの?
さっきから的外れな話してんじゃねえよ
0140デフォルトの名無しさん
2013/02/13(水) 21:15:40.81>>127 が質問しているのはインストールしたHaskellの容量が1GBもある「理由」。
何に容量を食われているのか分かれば、そこから理由が推測できる。
(でかすぎやしないか?というのは、もっと小さくできないのかという思いを
疑問系で発言しただけのことだろうから無視)
もし >>127 が単なる愚痴であるなら、そもそも、そんなものはチラ裏にでも書いておけ
0141デフォルトの名無しさん
2013/02/13(水) 21:21:54.040142デフォルトの名無しさん
2013/02/13(水) 21:25:17.780143デフォルトの名無しさん
2013/02/13(水) 21:40:48.010144デフォルトの名無しさん
2013/02/13(水) 22:01:35.75↓
フォルダ見てみればいいじゃん
↓
はあ?なんでそんなことしなきゃいけないんだよ
0145デフォルトの名無しさん
2013/02/13(水) 22:16:34.62悪意を感じるな。
意図的に省略したか?
なんでこんなにでかいの?
↓
フォルダのサイズを見れば「何が」でかいのか分かる
「何が」が分かれば「どうしてか」は今よりもより良く推測できる
↓
はあ?なんでそんなことしなきゃいけないんだよ
だろうが。
単に、なんででかいんだよ、と言うだけで思考停止してるんじゃなくて、
自分でできるところまでまず調べろ。
容量をでかくしている主犯を調べるのはそのとっかかりだ。
その主犯がHaskellにどう関係してくるのか、
そいつは何故そんなにもでかいのか、
容量をでかくしているのはそいつだけなのか、これらを考えるのはその後だ。
0146デフォルトの名無しさん
2013/02/13(水) 23:27:22.65とりあえず、
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.600 :: 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つまり、>>121のisPalindromeは相等性を持つ型(値が明確)と認識されなかったからダメだった。
だから、その式ではa==aがInt == Int、Bool == Bool、String==String なのか解らないが為に()=>の制約が必要?
制約って関数の型をもっと強めることも出きるような物って感じがします。
0150デフォルトの名無しさん
2013/02/14(木) 13:13:38.62型変数に具体的な型を入れると何かが出てくる
入れる際に制約がもしあれば型クラスを指定する
0151146
2013/02/15(金) 00:48:04.33ところで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
の制約が必要となります。
こんな感じ ?
■ このスレッドは過去ログ倉庫に格納されています