[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 04/25 05:23 / Filesize : 232 KB / Number-of Response : 786
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 22:19:28.26 ]
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/

775 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 21:14:41.55 ]
NumでないとBitsに成れないって不条理じゃね?

別に四則演算なんてしなくても
ビット演算したいケースなんて普通にあるだろ

Word32でnewtipeした型をBits宣言したいけど
四則演算は禁止したい

こんなときどうすれば良いの?

776 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 22:47:19.28 ]
ttp://snak.tdiary.net/20091020.html
これ↑を読んでたんですけど
Functorのインスタンスを説明するところで((->) e)はファンクタだって記述がありました。
GHCIとかで:typeしてもエラーにしかならないんですけど
(->)ってのは普通の演算子じゃなくて、型宣言のところに出てくるアレって解釈であってますか?
よくわかってないですが、型より一段階メタな種を扱う演算子みたいな扱い??

もし可能であれば、((->) e)のFunctor実装がどんな感じになるか教えてもらえないでしょうか。

777 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 23:25:53.07 ]
>>775
Bitsクラスをただのビット列表現と解釈しているから不条理に思えるのでは?

ライブラリドキュメントにはこうハッキリと書かれている
The Bits class defines bitwise operations over integral types.
これは、integral types に対してビット演算を提供するクラスなんだよ
だから fromIntegral 関数を持つ Num クラスのインスタンスである必要がある

integral types ではない型に対してビット演算を提供するクラスは、
今のところ標準ライブラリには入っていない
(HackageDB にも、貴方の望むライブラリは今のところなさそうだ)

また、Num のクラスメソッドを使用した場合に実行時にエラーを出す方法はあるが、
GHC によるコンパイル時にエラーを出す方法は、これまた今のところない

よって、そのようなビット列表現および演算するクラスが必要なら、
残念ながら自作するしかない

778 名前:777 mailto:sage [2012/03/02(金) 23:27:31.24 ]
>>777
訂正

誤) だから fromIntegral 関数を持つ Num クラスのインスタンスである必要がある

正) だから fromInteger 関数を持つ Num クラスのインスタンスである必要がある

779 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 23:29:54.57 ]
サンクス エニウェイ

780 名前:777 mailto:sage [2012/03/03(土) 00:09:57.84 ]
>>776
> GHCIとかで:typeしてもエラーにしかならないんですけど

では、そのすぐ上に Either e も「Functor のインスタンス」だという説明がありますが、
これも :type を試されましたか?

エラーが出ますよね
だって、Either も (->) と同じように関数や演算子じゃないから

「〜は*のインスタンス」と言った場合、〜の部分には「型」がきます

型の情報は :type では得られません(:type は値の型情報を得るもの)
型の情報は :info などで得られます
ただし、正確には :info には型ではなく型構築子を指定しないといけません
(たとえば :info Either e ではなく :info Either)

と言うことで、((->) e) は単なる型であり、意味上は何も特別なことはありません
試しに :info (->) をすれば、((->) r) 型が Functor のインスタンスだと分かります

正確に言えば (->) が種 * -> * -> * の型で、((->) e) が種 * -> * の型です


((->) e) 型のFunctor実装は処理系依存でライブラリでは公開されていませんが、
次のように解釈できるような実装になっているはずです

instance Functor ((->) e) where
  fmup f g = f . g

781 名前:780 mailto:sage [2012/03/03(土) 00:15:43.68 ]
>>780
くそっ、また訂正だ

誤) fmup f g = f . g

正) fmap f g = f . g

782 名前:デフォルトの名無しさん mailto:sage [2012/03/03(土) 00:31:28.38 ]
>>776
instance Functor ((->) e) where
fmap = (.)

783 名前:デフォルトの名無しさん mailto:sage [2012/03/03(土) 00:37:41.58 ]
サンクス エニウェイ



784 名前:デフォルトの名無しさん mailto:sage [2012/03/03(土) 00:48:51.17 ]
>>780 >>782
なるほど、型と値をごっちゃに考えてたせいで要領を得ない質問になってました。
手がかりは頂いたので、もうちょっと考えてみます。
詳しい解説ありがとうございました。

785 名前:780 mailto:sage [2012/03/03(土) 00:56:05.16 ]
>>784
手がかりついでに

>>776
> (->)ってのは普通の演算子じゃなくて、型宣言のところに出てくるアレって解釈であってますか?
> よくわかってないですが、型より一段階メタな種を扱う演算子みたいな扱い??

(->) が演算子(関数)ではなく、種 * -> * -> * の型であることは先ほど言いましたが、
これは同時に「型構築子」とも暗に言いました((->) e は型構築子ではありませんよ)

意味上は特別なことはありません、単なる型構築子です

だから例えば f :: Int -> String -> Bool -> Maybe Char という型の関数は、
本当は f :: (->) Int ((->) String ((->) Bool (Maybe Char))) と型シノニムを書くべきで、
でも何も特別なことをしなくても中置演算子のように書けるのは一種の構文糖衣なんです

本来、アルファベットではなく演算子の形をした識別子を型構築子として使って中置したかったら、
識別子をコロンで始めないといけませんから(:* とか :+: とか :-> とか)






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<232KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef