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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:41:29 ]
haskell.org
www.haskell.org/

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

過去ログ
関数型プログラミング言語Haskell
Part1 pc.2ch.net/tech/kako/996/996131288.html
Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 pc11.2ch.net/test/read.cgi/tech/1193743693/
・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。


732 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:55:40 ]
Haskell系のShellでオススメってある?

733 名前:36 ◆K0BqlCB3.k mailto:sage [2008/09/17(水) 00:00:30 ]
>>732
シェルって何のこと?
言語とは関係ないと思うけど。
シェルスクリプトのことを言っているの?

734 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:07:44 ]
>>733
HSHみたいなやつ

探してみた奴だとどれも開発止まってて…

735 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:09:07 ]
Haskell風構文のシェルっていくつかあるんだな、ググって初めて知ったわ

736 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:15:11 ]
Haskell系の自然言語でオススメってある?

737 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:22:13 ]
lojbanとか?
自然言語じゃないけど

738 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 15:52:29 ]
Yiとか使ってる人いるの?

739 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 17:56:30 ]
Yi って 彝 ?

740 名前:デフォルトの名無しさん [2008/09/17(水) 18:20:56 ]
ぅぃ?



741 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 18:31:27 ]
haskell.org/haskellwiki/Yi
使ったこと無いなぁ。

742 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:29:49 ]
ひょんなことからerlangを勉強し始めたが、構文はともかく、思想としては面白いな。
並行指向プログラミングというのかな?
このパラダイムはオブジェクト指向よりも現実志向のパラダイムのように思う。
Haskellでも並列化がうまくいけばerlangみたいな仕組みを実装できるかもしれない。

# erlangの構文は糞 糞 糞 糞杉

743 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 18:18:31 ]
ぅぃゅ

744 名前:デフォルトの名無しさん [2008/09/19(金) 20:28:25 ]
コンカレントハスケル?

745 名前:デフォルトの名無しさん [2008/09/19(金) 20:34:40 ]
ああ、コンカレントは並行だったか・・・

746 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 11:00:42 ]
>>743
私はProlog屋なので、erlangの構文のクソ部分に敏感でない。
お手数かけて恐縮だが、糞の部分を列挙していただけると有難いのだが。

747 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/20(土) 12:04:07 ]
>>742
たぶん、その思想というのはpi-calculusのことかな。

748 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:08:03 ]
ここのみんなからするとgtk2hsって綺麗なの?

749 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:29:19 ]
Erlangってpi-calculusベースなのか

750 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 13:56:48 ]
>>746
743ではないけど、
receive...endとか、カリー化できないとかではないですか?



751 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 14:52:33 ]
>>723
元記事ではSTMが挙げられてるけど、OCamlだと無くね?

>>749
綺麗って何が?Gtk2Hsを使ったコード?
それならあまり綺麗じゃないんじゃない。
GUIを綺麗に書くためのハイレベルなライブラリは
いろいろあるけど、どれも決定打にはなってないような。

752 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:23:34 ]
>>751 >>749 じゃなくて >>748 ?

753 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:27:39 ]
>>752
>>748な俺からでもそれはわかる。


754 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 00:46:57 ]
gtk2hsと言えば、
gtk_rc_parse_string相当の関数や、
gtk_widget_modify_cursor(これは新しいからか)相当の関数が見付からなくて諦めたことがあります。。
いや私の検索能力が低いだけだと思うんですが、かなり頑張ってもどうしても見つかりませんでした。。。
皆さんgtkやpango、gdkの関数を捜すときってやっぱり根性ですか?
大抵はキャメルケースにすれば大丈夫ですがそうでない時はかなり困りますよねー。。

755 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 12:17:25 ]
いや、検索能力の問題じゃなくて、実際に無いんじゃない?
Gtk2Hsのソースgrepしてみて無かったら無いような。

756 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 08:20:06 ]
webで読んでるけどreal world haskell凄いヴォリュームだな
一週間やってもまだ終わらん
製本版はもう鈍器レベルだな


757 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 09:55:41 ]
なにか面白いこと書いてあった?

758 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 15:02:13 ]
これでしょ
book.realworldhaskell.org/read/

759 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 16:29:27 ]
url知らないって意味じゃなくて、自分では読む気が無いってことだよ。

760 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:37:06 ]
ぱっと見た感じでは、名前の通り実際にHaskellで開発する時に「背中に手が届く」本になってる感じ。
たとえばデータベースと通信する方法とか、
GUIを作るときのライブラリとかツールとかの紹介とか、
どちらかというと「Haskell逆引きクイックリファレンス」
みたいな感じだね。
目新しいことは何もないけど、逆引きリファレンスとしてはいろんなライブラリとか紹介されていて便利かな。



761 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:39:11 ]
いろいろサンプルコードも載ってるからわかりやすい。
文章の良よりコードの両方の方が多いから英語が苦手な人でもわかると思う。

762 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/09/22(月) 16:39:49 ]
良 → 量
コードの両方 → コードの量

763 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 11:57:39 ]
Parsec.Tokenをロードすると
ERROR file:{Hugs}\packages\parsec\Text\ParserCombinators\Parsec\Token.hs:64 - Syntax error in data type declaration (unexpected `.')
とでて読み込めないのですがどうしたらいいのでしょうか

764 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 12:09:05 ]
>>763
Hugsを標準モードじゃなくて拡張モードで起動すればいい
hugs -98

765 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 12:51:18 ]
>>764
無事読み込めました。ありがとうございます

766 名前:デフォルトの名無しさん [2008/09/24(水) 15:23:46 ]
do構文で、変数の使用が強制されるのはなんとかならんの?
.とか$とかの気の利いたバージョンない?

767 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 15:27:56 ]
何を言ってるのかよく分からんが >>= とか?

768 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 15:36:59 ]
>>=だけですっきりいけるならdo構文使わないでしょ(ってこともないか?少なくとも俺は)。
do構文でモナドを「外す」ためだけに一時変数がやたら必要になるのがイヤって話。
つまるところ>>=になっちまいそうな気もするけど、
便利な演算子なり特殊なカッコなりで、無駄な変数使わずに何とかならんかなぁ、と。


769 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:11:24 ]
なにか具体例見せてくれ

770 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:18:02 ]
do式の中で、
  a <- v
  b <- f a
は、aを使わずに
  b <- v >>= f
と書ける

同様に、
  a <- v
  let b = f a
は、
  b <- liftM f v
と書ける

こういう話?
>>=は普通にdo構文の内部で使えるよ
俺はこの場合=<<を使う方が好きだけど



771 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:26:30 ]
何を言ってるのか俺もよく分からん。
do ...; a <- m; f a; ...

do ...; f =<< m; ... -- m >>= f でも同じだけど...
とか
do ...; a <- m; let b = f a; ...; g b; ...; h b; ...

do ...; b <- liftM f m; ...; g b; ...; h b; ...
とかすればいいって話じゃなくて?

って書き込もうとしたんだけどその前に新着レス見たら>>770被りすぎ。

772 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:44:57 ]
n <- m
a <- n

a <- join m
にするパターンもあるかも。

n <- m
o <- n
a <- o

a <- join (join m)
とか。

773 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:48:50 ]
ぱっといい例は書けないけど、例えば単純な例で
do args <- getArgs
cnt <- getContents
now <- getClockTime
return someFunc args cnt now
を、
do return soumeFunc #getArgs #getContents #getClockTime
とかこんな感じに書けないかと。(#が架空のモナド外し演算子とか)


774 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:53:15 ]
>>770,771,772
ありがとう。特にjoinは使った事なかった。
俺がアホでした。


775 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 16:56:54 ]
あれ?やっぱ違うや。求めてるのとjoin。いや、それはそれで勉強になったけど。

776 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:01:37 ]
というか、liftM3ですね。とりあえず釣って来ます。

777 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:21:21 ]
ちなみに、
do args <- getArgs
   cnt <- getContents
   return otherFunc args True cnt
だったら?

778 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 17:27:31 ]
>>773みたいな構文は俺も欲しい
このスレで前に同じことを書いた記憶がある
Template Haskellを使えばなんとかなるかな

>>777
liftM3 otherFunc getArgs (return True) getContents
不恰好だけど

779 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 18:03:09 ]
>>773 は Control.Applicative を使って
soumeFunc <$> getArgs <*> getContents <*> getClockTime

return sumFunc <*> getArgs <*> getContents <*> getClockTime
って書ける。infixl 4 # ; (#)=(<*>) とすればあのままいける。
っていうのは
(return soumeFunc) #getArgs #getContents #getClockTime
じゃなくて
return (soumeFunc #getArgs #getContents #getClockTime)
のつもりだろうから嘘だけど。

ただ、IO は Applicative のインスタンスになってるけど、
一般のモナドは WrappedMonad って型が用意されてるだけなので、ちょっと面倒。
でも Control.Monad に <*> と同じ意味の ap ってのがあってこれはどのモナドにも使える。
<$> とかの Control.Applicative にあるいろいろな関数がないけど。

あと Control.Applicative には f (a -> b) -> a -> f b な関数が無いけど
それを f *$ x = f <*> pure x とか定義すれば
liftM3 otherFunc getArgs (return True) getContents は
otherFunc <$> getArgs *$ True <*> getContents と書ける。さすがにキモイ。

780 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 18:18:11 ]
おおっ、あるのね。
俺の見る程度の範囲じゃ<*>とかはあんま見ないけど、そういえばapは見るな。
まあ、>>698とか見ると、>>778の書き方が普通は落とし所って所かも知れんけど、調べてみます。



781 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:29:43 ]
windows環境でunix 2.3.0.0のインストールに成功した方っていらっしゃいますか?
私の環境では以下のエラーを吐いてbuildに失敗します。

compiling dist\build\System\Posix\DynamicLinker\Module_hsc_make.c failed
command was: C:\ghc\ghc-6.8.3\bin\ghc.exe -c -package base-3.0.2.0 -package directory-1.0.0.1 -Iinclude dist\b
uild\System\Posix\DynamicLinker\Module_hsc_make.c -o dist\build\System\Posix\DynamicLinker\Module_hsc_make.o

どなたか知恵をお貸しください

--unix.cabal
>The package is not supported under Windows (except under Cygwin).
Windowsは基本的に非サポート、
Cygwin環境下はOKという意味だと思ったんですが違いますか?


782 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 23:58:13 ]
長くて貼れなかった部分(すみません)のログを見てみると
cygwinのフォルダにあるheaderファイルの発見に失敗しているようでした。

終電の時間が近いので、検索パスの追加をした所で今日は帰ります

783 名前:デフォルトの名無しさん [2008/09/25(木) 00:01:22 ]
仕事でハスケル使ってんの?

784 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:25:45 ]
言語設計学者の悲願の言語だけど、開発環境はまだ全然整備されていないから、ほぼ0

785 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 03:02:05 ]
学生だろ?

786 名前:デフォルトの名無しさん [2008/09/25(木) 03:18:09 ]
学生のうちから終電まで勉強してんのかよ。
そんなんじゃ社会に出てからもたんぞ。

787 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 03:51:42 ]
Schemeのcondみたいのはどう書くのがよいでしょうか?
case でマッチング無しガードのみにすればとりあえず出来るけど、dummyや_が冗長。
case dummy of
   _ | conditionA -> bar
     | conditionB -> foo
   otherwise -> baz


788 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 04:41:08 ]
そこだけ別函数にしちゃえば良いんじゃ?

789 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 12:37:19 ]
>>786
何という優しさ。

790 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 19:56:07 ]
こういうsyntax sugarが欲しいなあ。

data X = A | B | C | D

case x of
A | B -> 1
C | D -> 2



791 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 19:58:51 ]
確かに欲しい
でも縦線だとガードに見えるから別の記号が要るな

792 名前:781 mailto:sage [2008/09/25(木) 20:53:49 ]
だめでした。
定義されていない型、定義されていない関数のエラーは
HsUnix.hに手を加えてなんとかしましたが(includeするファイルを追記)

↓結果
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x49):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0x8d):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xb5):Module_hsc_make.c: undefined reference to
`_impure_ptr'
dist/build/System/Posix/DynamicLinker/Module_hsc_make.o(.text+0xe9):Module_hsc_make.c: undefined reference to
`_impure_ptr'
collect2: ld returned 1 exit status
linking dist\build\System\Posix\DynamicLinker\Module_hsc_make.o failed

それはともかく、今夜はwww.haskell.orgに繋がりにくいですね

793 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 13:22:23 ]
>>790
そういう、かゆいところに手が届くのは、やっぱりLISP系最強なんだろうか。


794 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:03:38 ]
流行に乗ってHaskellを勉強しているのですが、バイナリファイルの扱い方に困ってます。

int numFloat;
int numInt;
float floats[numFloat];
int ints[numInt];

C的な擬似コードで書くとこんな感じのバイナリファイルに対して、
floatsとintsのデータを取ってきて文字列でフォーマット化して表示してみよう、と思っています。

hFile <- openFile filepath ReadMode
cs <- hGetContents hFile

ひとまずこれで[Char]を持ってきて、そこからnumFloatとnumIntを切り出せばよいか、
と思ってるのですが、じゃあそれってどうするんだろう、ってところで詰まってます。

(numFloat,numInt,残り) = hogeFunction cs

みたいな感じで切り出すのが関数型的な感じなのかな、と思っているのですが、
そもそもこの辺の考え方からして駄目っぽいですか?

795 名前:初心者修業中 mailto:sage [2008/10/01(水) 23:29:57 ]
>>794
バイナリモードじゃないとダメなんじゃないでしょうか?
こんなのがありました

ttp://ha6.seikyou.ne.jp/home/yamanose/haskell/wave2.html

796 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:38:17 ]
>>795
ありがとうございます。
BinaryModeって付けないと駄目なのと、
あとPtrを経由してデータを取ってくるんですね。

これで勝つる!

797 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:03:06 ]
べつにPtrを経由しなくても>>794の方針でいけるよ
効率を気にするなら別だけど

798 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:27:22 ]
Ptrを経由しないとバイナリ表現のFloatから
HaskellのFloatを得る手段が難しいよ。
thread.gmane.org/gmane.comp.lang.haskell.cafe/44845/focus=44927

799 名前:初心者修業中 mailto:sage [2008/10/02(木) 00:56:54 ]
>>797
テキストモードの場合、、
control-ZをEOFと認識したり、CRLFを LFに変換すると
GHCのマニュアルにありますが、
問題ないのでしょうか?

800 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:06:55 ]
>>799
問題ある
>>797は、バイナリモードで開いた上でgetContentsすればいい、という意味で言った

>>798
確かにそうだな
ちゃんとテストしてないけど一応こんなんでいけるみたいだ

import Data.Bits
import Data.Word

w32ToFloat :: Word32 -> Float
w32ToFloat w
  | ep == 255 && sf /= 0 = 0 / 0
  | sf == 255 = sign / 0
  | sf == 0 && ep == 0 = sign * 0
  | otherwise = sign * encodeFloat r e
  where
    sn = shiftR w 31
    ep = shiftR w 23 .&. 0xff
    sf = w .&. 0x7fffff

    sign = if sn == 1 then -1 else 1
    e = fromIntegral ep - 127 - 23
    r = fromIntegral sf + 0x800000




801 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:37:29 ]
バイト列をFloatとして解釈させたいわけだから、
必要なのは Word32 -> Float じゃなくて [Word8] -> Float なんじゃなかろうか。
というわけでPtr経由だけど書いてみた。

import Foreign

fromBytes :: Storable a => [Word8] -> a
fromBytes bs = unsafePerformIO $ allocaArray (length bs) $ \ p -> pokeArray p bs >> peek (castPtr p)

toBytes :: Storable a => a -> [Word8]
toBytes x = unsafePerformIO $ alloca $ \ p -> poke p x >> peekArray (sizeOf x) (castPtr p)

toBytes (0.5 :: Float) => [0,0,0,63]
fromBytes [0,0,0,63] :: Float => 0.5

802 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 09:32:32 ]
で、整数のendianはどうするとか色々とケチがついていくにしたがって、重くて遅いコードに変身していくわけだ。

803 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 10:50:10 ]
endian変更は[Word8]にreverseかければ良いんじゃね。

システムのendian判定はこんな感じ?
isLittleEndian = (1 :: Int) == fromBytes [1,0,0,0]
isBigEndian = (1 :: Int) == fromBytes [0,0,0,1]

804 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:03:52 ]
やっぱり>>800にはバグがあった
-  | sf == 255 = sign / 0
+  | ep == 255 = sign / 0

>>802
[Word8]からWord32を作って、そこからFloatにすればシステムのendiannessを気にする必要ないよ
この場合PtrやUArrayを経由するのでもencodeFloatでも良い

805 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:35:05 ]
-- テストしてみた。

-- import Test.QuickCheck

(f `eq` g) x = Result (Just (f x == g x)) [] [show (f x), show (g x)]

forAllBinaryFloat :: (Testable b) => ([Word8] -> b) -> Property
forAllBinaryFloat t =
 forAll (choose (0,1)) $ \s ->
 forAll (oneof [elements [0,255], choose (1,254)]) $ \e ->
 forAll (oneof [elements [0], choose (1,2^23-1)]) $ \f ->
 t (sefToBytes s e f)

sefToBytes :: Int -> Int -> Int -> [Word8]
sefToBytes s e f = endian [shiftL s' 7 .|. shiftR e' 1, shiftL e' 7 .|. f1, f2, f3]
 where
 [_,f1,f2,f3] = endian (toBytes f)
 [s',e'] = map fromIntegral [s,e]
 endian = if head (toBytes (1 :: Word32)) == 1 then reverse else id

prop_float :: (Float -> Float) -> Property
prop_float fl2fl = forAll (oneof fls) (id `eq` fl2fl)
 where fls = [elements [0,{-0/0,-}1/0,-1/0], fmap (/ 2^127) arbitrary, arbitrary]

prop_bytes :: ([Word8] -> [Word8]) -> Property
prop_bytes bs2bs = forAllBinaryFloat (id `eq` bs2bs)

806 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:36:01 ]
-- quickCheck test1 や verboseCheck test5 とかで実行。

test1 = prop_float (fromBytes . toBytes)
test2 = prop_float (w32ToFloat . fromBytes . toBytes)
test3 = prop_float (uncurry encodeFloat . decodeFloat)
test4 = prop_bytes (\bs -> toBytes (fromBytes bs :: Float))
test5 = prop_bytes (toBytes . w32ToFloat . fromBytes)
test6 = forAllBinaryFloat $ \bs -> not (isNaN (fromBytes bs :: Float)) ==>
 (fromBytes `eq` (w32ToFloat . fromBytes)) bs

{- 1, 3 は通った。最初 NaN/=NaN をうっかりした。
w32ToFloat は非正規化数を無視してるので、2, 5, 6 が通らなかった。
4 は NaN のときに、仮数部の最上位ビットがおかしくなった。
5 は w32ToFloat は NaN を全て 0/0 にするのもあって通らなかった。
NaN の表現が変わるのは Float を解釈する場面
(つまりコピーとかじゃない)なら問題無いだろうけど。-}

807 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:41:10 ]
QuickCheckすげー
盲目的なランダムテストだけじゃないのな

概念的には、(ieee754で表現される)外部フォーマットのデータを読んで、
ネイティブのFloatに変換して使いたいのか、
それともieee754データとしてそのまま扱いたいのかでやることが変わってくるな
実際にはどうせieee754を採用してるアーキテクチャでしか動かさないから、ショートカットが効くわけだけど

808 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 01:51:57 ]
QuickCheckってどうも使い方が解らない。
テストが元実装と結局ほとんど同じにならない?
元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
結局同じになるのは必然だと思うんだけど。
仕様から演繹出来る他の事を確認しろって事かな?
でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?


809 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 03:06:21 ]
>テストが元実装と結局ほとんど同じにならない?
ならない。>>805-806を見れば分かる通り

>元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
>結局同じになるのは必然だと思うんだけど。
そういう場合もあるし、そうでない場合もあるから、決して必然じゃない
たとえば、ソート関数が正しいかどうか確認するコードと、
実際にマージソートやクイックソートをするコードは全然違うものになる
さらに「マージソートでもクイックソートでも結果が同じになる」みたいなのもテストになるし

>でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
もちろん
だれもテストで全ての誤りを発見できるとは思ってない

810 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:26:34 ]
あと、ランダムテストが有効な場合とそうでない場合があるよね。
>>805-806はあまりランダムである必要が無いかも。
きわどいケース(上の場合だと0、非正規化数、無限大、NaN)を
並べ上げにくい場合にランダムテストが有効な気がする。



811 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:35:10 ]
ああそうか、例えばソートの例の場合、
「正しくマージソート出来てるか」じゃなくて
「正しくソート出来てるか」のテストになるからか。

前者はQuickCheckに関わらず外部テストでは確かめようがないから、
「ソートする」じゃなくて「マージソートする」という仕様はソースレビューするしかないのか。

812 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:36:28 ]
単なる関数じゃあまり意味がなくて、
結果としてのアウトプットが特徴的で綺麗な性質を持ち、
かつ、その性質自体が目的である場合に威力を発揮するって感じか。
その類の物は、性能が競われる事が多い気がするから、その辺りのサポートもあると良いかも。

813 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:38:09 ]
2chって連続した半角スペースが に置換されるようになったの?

f :: A -> B のテストは
・B (or A) の == を使う場合
  ・一般の場合
    ・h :: A -> B を用意して f x == h x をテスト
  ・逆関数 g :: B -> A がある場合
    ・x == g (f x) をテスト
    ・y == f (g y) をテスト
・使わない場合
  ・r :: A -> B -> Bool をうまく用意して r x (f x) をテスト
(テストはランダムな x :: A, y :: B に対して)
大概こんな感じ。

元実装とほとんど同じテストってのは、
g やうまい r が無くて、f x == h x というテストしか無いんだけど、
f と違う h も無くて、でも f x == f x じゃバカ丸出しなので、
== を明示的には使わないで実質的に f x == f x と同じことをやる、
みたいな感じじゃないかな。

814 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:39:53 ]
うわ俺バカ丸出し。&nbsp;って書きたかった。

815 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:31:09 ]
datを直接見るようにすればnbspなんて使わなくてもインデントされるよ

816 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 12:19:55 ]
滅茶苦茶な事を聞いていそうで済みませんが、
cabal configure と runhaskell Setup.hs configure、
cabal build と runhaskell Setup.hs build、
cabal install と runhaskell Setup.hs install、
って何か違うんでしょうか。
同じだとしたらなんのために両方あるんでしょうか。

817 名前:初心者修業中 mailto:sage [2008/10/08(水) 15:33:21 ]
>>816
・runhaskell はHaskellのソースプログラムを実行するコマンド
・cabal はパッケージをインストールするコマンド
…と認識しています。

参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224

818 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 23:08:47 ]
オラ本でねーぞコラ


819 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 00:31:08 ]
cabal なんてコマンドあるの?
あるとしたら runghc Setup と打つより楽だからじゃ?

820 名前:初心者修業中 mailto:sage [2008/10/09(木) 01:00:41 ]
>>819
参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224
cabal-installというパッケージにcabalというユーティリティがあった。
パッケージのダウンロードからインストールまでを自動化してくれるようだ。



821 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:00:42 ]
今んとこ、RubyGemsを目指して整備中って事で、
最終的にSetup.hsはなくなるかオプショナルになってcabalコマンドに統一されるんじゃない?
page.freett.com/shelarcy/log/2007/diary_03.html#when_we_can_use_caball-install
hackage.haskell.org/trac/hackage/wiki/RubyGems

現時点でのそれら重複してるコマンドの詳細は判らないけど、installについては、
cabal install monadius
monadius
で遊べるってのは、Setup.hsでは無理だろう。


822 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:20:27 ]
>>821
RubyGemsなんて目指されると非常に困る。

823 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:13:24 ]
ん?どんな風に?

824 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:45:20 ]
質問です。
Haskellにて、二次元配列を時計回りに90度回転させるには、どうすればいいでしょうか?

今あるコードが
rot90 list = reverse (map (head) list) : rest
where rest = if length (concat taillist) == 0 then []
else rot90 taillist
where taillist = map tail list
ですが、ものすごく非効率的だと思います。

825 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:03:11 ]
>>824
length (concat taillist) == 0
の部分を
all null taillist
にでもすれば別に非効率的でもない気がする

俺ならtransposeを使うな
rot90 = transpose . reverse

826 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:24:00 ]
>>825
素早い回答ありがとうございます。
実は、transposeも定義しないといけなく、transposeでrot90を使っているので…。

transpose list = rot90 (hflip list)
hflip list = reverse list

というふうになっております。

827 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:39:20 ]
どうしてもrot90でtransposeを定義しなきゃいけないの?
そうでなくて単にtransposeが必要ってだけならその定義は捨てて
import Data.Listしてtransposeを使えば良いんじゃない?

828 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:45:38 ]
transposeって標準の関数ではないんですか?

829 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:53:59 ]
>>827

課題では、自分でtransposeを定義しろ、とのことでした。

830 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 20:20:13 ]
>>828
Prelude関数ではないのでData.Listをインポートしないと使えない。

>>829
だったら >>825 が最初に言ってる変更をするか、rot90を使わずにtransposeを定義すれば。



831 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 21:12:45 ]
Data.Listのtransposeはこれ
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([] : xss) = transpose xss
transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : transpose (xs : [ t | (h:t) <- xss])

832 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 06:57:02 ]
>>813
連続した半角スペースはjavascriptモードで書き込むときに置換されるらしい。

>>824-825
長方形じゃないときに、all だとエラー、any だと長方形になるように切り落とす。
filter 使えば>>831の transpose に map reverse . したような感じになる。
([<h or t> | h:t<-xss] = map <head or tail> (filter (not.null) xss))

違ったやり方なら
rot90 = foldl c []
 where
  c yss [] = yss
  c [] xs = [[x] | x<-xs]
  c (ys:yss) (x:xs) = (x:ys) : c yss xs
とか。






[ 続きを読む ] / [ 携帯版 ]

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

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