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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/10/25(金) 21:54:29.92
関数型プログラミング言語 Haskellについて語るスレです。

前スレ: 関数型プログラミング言語Haskell Part23
http://toro.2ch.net/test/read.cgi/tech/1376111807/

haskell.org
http://www.haskell.org/

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

過去ログ (10〜)
Part21 ttp://toro.2ch.net/test/read.cgi/tech/1358702176/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
0655デフォルトの名無しさん2014/01/26(日) 19:16:04.86
>>654>>652宛て
06566362014/01/26(日) 19:16:26.86
>>654
俺は Main 関数内で run してる。
0657デフォルトの名無しさん2014/01/26(日) 19:20:19.03
>>653
>なぜなら、たとえば関数 viewRecords の定義は recordsSource $$ recordsSink だから。
そこにrecordsSourceを直接書く代わりにCへの引数として受けとるようにする
という話を>>644からずっとしてるつもり
0658デフォルトの名無しさん2014/01/26(日) 19:20:48.91
>>654-655
mainを想定してる
06596362014/01/26(日) 19:28:50.76
>>657
飲み込みが悪くてすまんが、Cへの引数として受けとるというのが今ひとつ分からない。

もしかして、viewRecords 関数ではなく

f :: (MonadIO m) => Source m A -> m ()
f src = src $$ recordsSink

という関数を C に作れってこと?
で、viewRecords 関数の定義は f recordsSource にしろと?

もしそうなら、viewRecords 関数はどこに書く?

勘違いしてたらごめん
0660デフォルトの名無しさん2014/01/26(日) 19:41:14.64
>>659
たとえば、メインループを行う関数がCにあるなら、それを

loop :: (MonadIO m) -> Source m A -> Sink A m () -> m ()
loop source sink = input >>= \case ...

みたいに定義して、main内で、

runSqlite $ loop viewRecords recordsSink

みたいに呼ぶ

メインループがmain側にある場合も基本は同じで、mainが
viewRecordsを渡してやる
06616362014/01/26(日) 21:56:54.92
>>660
あぁ、やっと言いたいことが分かったような気がする。

C の loop 関数では、具体的な viewRecords 関数などを内部で呼ぶ代わりに、
「データを流す役割のソース」や「データを変更する役割のシンク」や「データを表示する役割のシンク」
などといったソース群とシンク群を引数で受け取るようにして、それを使う。

で、main 関数内などの MVC を統括する部分で、実際に C の loop 関数に、
具体的なソースやシンクを渡すのか。

なるほど、とても参考になった。
06626362014/01/27(月) 19:04:10.08
>>643
こっちも意味がわかった。

SQLへのアクセスに関わる部分(runSqlConn や runResourceT なども含めて)は
すべて M の中に閉じ込めることができてスッキリしたよ。

二人共ありがと
0663デフォルトの名無しさん2014/01/27(月) 19:31:00.47
FP Haskell Center

こういうIDEがクラウドじゃなくて普通にインストールアプリとして欲しいのだが
0664デフォルトの名無しさん2014/01/27(月) 23:06:17.38
試しに使ってみたけど、リアルタイム構文チェック凄いな
エディタの構文チェッカープラグインよりこっちの方が速いって一体w
このIDEもサーバ側も全部Haskell製(前者はFayでJSにしてあるけど)なんだなー、面白い

関係ないけど、Vim使いならSyntasticとghcmod-vim,neco-ghcあたりを入れればかなりIDEっぽく使えるのでお勧め
0665デフォルトの名無しさん2014/01/30(木) 00:57:48.91
arrowを使うと仕様変更に強くなるって聞いたんですけど本当ですか?
0666デフォルトの名無しさん2014/01/30(木) 01:24:35.69
>>665
誰に聞いたのそれ
0667デフォルトの名無しさん2014/01/30(木) 01:31:03.56
>>665
本当だよ
君も今すぐ使った方がいい
0668デフォルトの名無しさん2014/01/30(木) 08:28:54.39
銀の弾丸
0669デフォルトの名無しさん2014/01/30(木) 22:21:37.65
>>665
本当だよ。
みんなもう使ってるよ。

早く使わないと取り残されるよ。
0670デフォルトの名無しさん2014/01/30(木) 23:34:25.95
>>665
というかモナドは時代遅れだよ
0671デフォルトの名無しさん2014/01/31(金) 06:55:03.48
というか、みんなまだArrow使ってるのか
0672デフォルトの名無しさん2014/01/31(金) 07:28:57.24
一人ぐらいArrowとは何ぞやと語ってくれる事を期待した自分が馬鹿だった
0673デフォルトの名無しさん2014/01/31(金) 08:28:25.16
あれだよ。矢だよ。矢
0674デフォルトの名無しさん2014/01/31(金) 09:11:29.00
>>672
もっと煽らないと……。
0675デフォルトの名無しさん2014/01/31(金) 09:27:02.89
a...arrowってなんですか?
0676デフォルトの名無しさん2014/01/31(金) 09:38:49.58
arrow使ってるのに関数をカジュアルにuncurryされると萎える
0677デフォルトの名無しさん2014/01/31(金) 10:01:43.74
uncurryのなにがまずいの?
0678デフォルトの名無しさん2014/01/31(金) 11:08:55.55
>>672
なんで最初にそう聞かないの? いくらでも教えてあげたのに
おっとそろそろ出勤だ
0679デフォルトの名無しさん2014/01/31(金) 14:22:14.08
>>676
これは
uncurry (+) <<< (*100) &&& (*10) $ 2
こうすればいいですか><
app <<< (+) . (*100) &&& (*10) $ 2
0680デフォルトの名無しさん2014/01/31(金) 19:11:40.60
この書き込みを真に受けて質問したんですが、レスを見る限りこの人がおかしいだけなんですかね。

haskell-jaより引用:
(ikegami氏)
Arrow でつくると、疎結合の疎の具合がさらにゆるゆるになるので、多少の仕様変更にもすぐに対応できるかわりに
さらにスピードが低下する
仕様変更に対する強さ <-> スピード という両軸で見ると
Arrow <<< State/Reader/Writer monad << ST monad
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad-ST.html
ST は黒魔術なので、はっきりいっておすすめできない (が、スピードのために必要になるかもしれないので老婆心で)
0681デフォルトの名無しさん2014/01/31(金) 19:14:56.12
文脈を知らないけどそれだけ見ると支離滅裂だな
0682デフォルトの名無しさん2014/01/31(金) 19:21:47.20
まさかSTが黒魔術だったとは
0683デフォルトの名無しさん2014/01/31(金) 19:52:15.51
あー、そんな書き込みもあったな
例えばIOモナド版と純粋関数版の二つを作らなければならないはずのところを
arrowで抽象化しておけば一つだけ作ればすむ
だからIOで使うつもりだった関数を急に純粋に変えたくなった
みたいな状況で仕様変更に強くなるか、と聞かれたらyesなのでは
もうarrowのことあまり覚えてないので間違ってたらゴメンネ
0684デフォルトの名無しさん2014/01/31(金) 20:15:10.55
なるほど、参考になります……
0685デフォルトの名無しさん2014/01/31(金) 20:44:32.50
初めから全部モナドで抽象化しておいて
純粋にしたいところだけidentityモナド使えばいい気がしてきた
やっぱarrowいらんわ。arrowは糞。
0686デフォルトの名無しさん2014/01/31(金) 22:15:36.30
モナドはdo記法があまりにも的確すぎて、数学の歴史を愚弄している
0687デフォルトの名無しさん2014/01/31(金) 22:19:11.97
最近どこかで聞いたフレーズ…
0688デフォルトの名無しさん2014/01/31(金) 23:29:19.00
>>686
愚弄?kwsk
0689デフォルトの名無しさん2014/01/31(金) 23:55:35.64
歴史を愚弄でググレ
0690デフォルトの名無しさん2014/02/01(土) 23:27:57.78
HSpec を使ったテストコードを cabal で自動実行したいのだが、
テストコードの書き方が分からん。
(参考資料 : https://github.com/kazu-yamamoto/unit-test-example/blob/master/markdown/ja/tutorial.md

Exceptoin の bracket 関数を使って、
メイン処理の前後でリソースの確保と開放を行う関数 useResource(仮名)がある。

メイン処理サブ関数 f1、f2、..., fn があって、
メイン処理関数 f :: Resource -> IO a の中でそれらが呼ばれ、処理される。
もちろん、f1、f2 らはそれぞれ useResource 関数で確保したリソースを使う。

本来なら f に useResource を適用して一連の処理を行うのだが、
今は個々の f1、f2、..., fn をテストしたい。

こういう状況の場合、HSpec 用の t :: Spec 関数はどう書くのが一般的なのかな。

describe "〜〜〜"
 it "〜〜〜" $ do
  [ここ]

[ここ] に useResource を書いて f1 や f2 などをそれぞれぶち込んで
結果を正常値と比較したり、例外の発生をテスしたりすると、
個々のテスト毎にリソースの確保と開放が発生するよね。

cabal で自動テスト実行するなら、これは仕方ないのかな?

もしリソースがデータベースとかで、テストで QuickCheck を使ってたら、
けっこう悲惨なことにならない?
0691デフォルトの名無しさん2014/02/02(日) 13:25:55.74
一般的な自動テストの話で恐縮だか、
時系列で変化するものは、一般的に考慮が必要。

単体テストなら
・関数的な結果を返すモックにする
・DBの中身が変わらないことを前提に、トランザクションで囲んで、rollbackさせる
(comitされる処理は対応出来ない、serialやoid消費される前提)
現在時間などの変数に注意。

結合やシナリオということであれば、
・DB初期化、シード投入、実行
・組み込みDBなら、スナップショット切り替え、実行

quickcheckに組み合わせるのは、基本モックなのではという気がする。
0692デフォルトの名無しさん2014/02/02(日) 13:53:47.77
>>691
あぁ、なるほど、こういう場合にモックを使うのか

ありがと、やってみるよ
0693デフォルトの名無しさん2014/02/02(日) 14:56:44.18
hspec-test-framework パッケージを入れて、
HSpec に test-framework をかぶせて使ったのだけど、
テスト結果を Jenkins で使える XML 形式で出力するにはどうすればいい?
06946932014/02/02(日) 15:44:56.64
hspec-test-framework パッケージのTest.Framework.defaultMainのソース見て分かった

現状無理だったわ

スレ汚してすまんかった
06956932014/02/02(日) 16:10:21.20
テスト時にモックを使う方法で基本的なことを確認させてほしい。

>>690 の状況をシンプルにすると、
モジュール A の中でデータベースを使っていて、
データを出したり書き込んだりする関数が公開されている。
このモジュール A が公開している関数をテストしたい。

もちろん、モジュール A は変更を一切加えること無く。

データベースの接続などはコストが高いのでテスト時はモックを使う、となると、
そもそもモジュール A はデータベースへ直接アクセスしていてはダメだということか?

例えば、データベースへのアクセスを抽象化した型クラスを作り、
そのインスタンス型の値を外部からもらって、それを使ってアクセスするようにしておかないと、
データベースのモック化はできない、という認識でいいのかな?
0696デフォルトの名無しさん2014/02/02(日) 22:11:50.43
クラスの定義において、関数の引数や戻り値の部分を型変数でパラメータ化するように、
コンテキストの部分をクラス変数みたいなのでパラメータ化できないでしょうか。

たとえば

class C c where
 f :: (??? t) => Int -> t

のようなクラス宣言があったとして、この ??? の部分を
型クラス C のインスタンス型毎に変えたいです。

{-# LANGUAGE InstanceSigs #-}

instance C X where
 f :: (ClassA a) => Int -> a
 f v = ...

instance C Y where
 f :: (ClassB b) => Int -> b
 f v = ...

このようなことは可能でしょうか。
06976962014/02/02(日) 22:18:14.41
>>696
すいません、関数 f を使う時に
コンテキスト制約に使ったクラス ClassA から型 X のものであること、
コンテキスト制約に使ったクラス ClassB から型 Y のものであることが推論できるように
ということです。

そのような推論ができなければ、クラス C の定義において
関数 f の引数か戻り値に c を入れておくことで対処しますが、
とにかく >>696 のような使い方ができるクラス変数なるものはあるか、という質問です。
0698デフォルトの名無しさん2014/02/02(日) 22:18:19.82
>>696
{-# LANGUAGE ConstraintKinds, TypeFamilies #-}
class C c where
 type Constr c :: * -> GHC.Exts.Constraint
f :: (Constr c t) => Int -> t
06996982014/02/02(日) 22:19:52.53
ごめんインデントみすった
{-# LANGUAGE ConstraintKinds, TypeFamilies#-}
import GHC.Exts
class C c where
 type Constr c :: * -> GHC.Exts.Constraint
 f :: (Constr c t) => Int -> t

>>697
>コンテキスト制約に使ったクラス ClassB から型 Y のものであることが推論できるように
具体的にどういうコードでどういう推論が起こって欲しい?
07006962014/02/02(日) 23:19:48.44
>>699
ありがとうございます。
そのやり方で、インスタンス毎にコンテキスト部分をかえることができました。

ついでに、ConstraintKinds や TypeFamilies を調べている特に、
次の方法でも似たようなことができる事が分かりました。

{-# LANGUAGE MultiParamTypeClasses, ConstraintKinds, TypeFamilies #-}

class C c p where
 f :: (p t) = Int -> t

instance C A X where
 f :: (X t) => Int -> t
 f v = ...

instance C B Y where
 f :: (Y t) => Int -> t
 f v = ...


> 具体的にどういうコードでどういう推論が起こって欲しい?

今回挙げた例で言えば、

g :: (X t) => t
g = f 7

という使い方をすれば B の f ではなく、A の f だとみなされると嬉しいです。
0701デフォルトの名無しさん2014/02/03(月) 06:07:38.67
>>700
>次の方法でも似たようなことができる事が分かりました。
そのコードならTypeFamilies拡張要らないな
>>699の場合ではConstrという関連型を宣言するのに必要だった

>g :: (X t) => t
>g = f 7
>
>という使い方をすれば B の f ではなく、A の f だとみなされると嬉しいです。
これは無理だと思う。fの型は
f :: (C c p, p t) => Int -> t
だけど、gの型シグネチャからは(X t)から(p t)が言えることが要請されるだけで、
p=Xが確定する訳じゃないので、情報が足りない
07026962014/02/03(月) 07:09:51.19
>>701
あの後いろいろ試してみたのですが、自分で見つけた方法の方は、
今回の目的に関して言えば、どうも使い勝手が悪いです。

> これは無理だと思う。fの型は ・・・

このことと関連しますが、自分のやり方だとクラス内の全ての関数で、
class C c p where の c と p をシグネチャのどこかに入れないと推論できない。
class C c p where 程度ならまだなんとかなりますが、
class C c x y z ... where と少し増えただけでとても不便になりました。

その点 >>699 の方法は柔軟性があるので使いやすかったです。

> gの型シグネチャからは(X t)から(p t)が言えることが要請されるだけで、
> p=Xが確定する訳じゃないので、情報が足りない

やはりそのようですね。
こちらの方は諦めます。
0703デフォルトの名無しさん2014/02/08(土) 10:15:20.05
こういう事ってできますか?(実際はもっと複雑ですが要約するとこんな感じです)

f :: a という関数シグネチャがあって、この関数 f の定義として、
a が Int 型だった場合のみ特別な事をして、そうでない型の場合は一般的な事をする。

f :: Int
f = 特別な何か

f :: a
f = 一般的な何か

みたいな。
0704デフォルトの名無しさん2014/02/08(土) 10:28:07.17
>>703
「特別な何か」と「一般的な何か」が意味的に同じ(違うのは効率だけ)なら、
書き換え規則で後者を前者に書き換えるのがおすすめ
意味的に違うならOverlappingInstancesしかないけど、
いろいろ厄介なので、使わないで済むなら使わないのを勧める
0705デフォルトの名無しさん2014/02/08(土) 10:32:45.93
>>704
ありがとうございます。
調べてみます。
0706デフォルトの名無しさん2014/02/08(土) 11:20:08.66
ghci 上での書き換え規則について質問です。

予め ghc でコンパイルして *.hi ファイルを作っておくことで、
対となる *.hs ファイルをロードすれば ghci 上でも書き換え規則が適用されるんですが、
*.hi ファイルの無い *.hs ファイルのロードのみでも適用する方法って無いでしょうか。

ちょっとだけ不便です。
「そう言えば忘れてた」と思って *.hs の内容をちょっと変更して、
ghci 上で再ロードした時に、書き換え規則が適用されず「あれ?」となり、
*.hi ファイルを出していなかったことを思い出すまで時間がかかったり・・・

ghci 上でちょっとした修正と実行テストを繰り返す場合など、なかなか面倒だったりしますよね。
0707デフォルトの名無しさん2014/02/08(土) 15:23:45.64
>>706
書き換え規則は最適化の一種なのでghciでは使えないっぽいね
0708デフォルトの名無しさん2014/02/09(日) 10:07:53.53
>>707
やはりそうですか。
これは我慢するしか無いですね。

将来のバージョンでは書き換えなど
最適化してロードされるオプションも付けて欲しいです。
0709デフォルトの名無しさん2014/02/09(日) 13:16:16.81
>>708
要望はglasgow-haskell-usersへ
0710デフォルトの名無しさん2014/02/09(日) 13:48:25.21
>>709
英語が書けないから、要望を出すのは諦めました。
0711デフォルトの名無しさん2014/02/09(日) 14:16:48.51
その程度の簡単な英語もわからないんじゃ Haskell 使うのつらくない?
0712デフォルトの名無しさん2014/02/09(日) 15:01:31.44
>>711
今のところ全く問題ないです。
読むことはできるので。
0713デフォルトの名無しさん2014/02/09(日) 15:17:42.32
東南アジアの留学生がHaskell使うために日本語の勉強しなおしたとか言ってたのを思い出した
0714デフォルトの名無しさん2014/02/09(日) 15:28:59.34
HUnit で、実装が正しければ必ず例外が発生することをテストするにはどうすればいい?

例外が発生しない状態だとテストに失敗しとたとみなす、という意味だけど。
0715デフォルトの名無しさん2014/02/09(日) 15:42:38.26
>>714
例外が投げられたら捕捉してTrueを返し、そうでなければFalseを返すようなアクションを書いて、
それを(@?)かなにかを使ってテストにすればいいと思う
0716デフォルトの名無しさん2014/02/09(日) 15:57:11.06
>>715
やっぱそういう事になるのか
例外をテストする関数か何かライブラリにあっても良さそうなもんだが・・・

ありがと
0717デフォルトの名無しさん2014/02/09(日) 21:06:40.67
test-framework でテストを構築してるんだけど、たとえば

testGroup "Test Group1"
 [ testCase "Test1" test_something1
 , testCase "Test2" test_something2
 ]

というテストグループがあったとして、
test_something1 のテストに成功した場合のみ
test_something2 のテストを行う、ということはできる?

試しに test_something2 のテストを testGroup で囲ってみたが、
何も変わらなかった(普通にテストされる)。
0718デフォルトの名無しさん2014/02/09(日) 21:51:36.15
Haskellでコンソールの好きな場所に好きな色で文字を表示する方法を探しています。

やりたいことは、コンソールの一部領域だけスクロールするように見せたり、
プログレスバーを表示させたりするような CUI アプリを作ることです。
0719デフォルトの名無しさん2014/02/09(日) 22:13:31.77
>>718
個人的に使っているのは、この二つ。
CUIフレームワークなら: http://hackage.haskell.org/package/ncurses
自分で細かく制御したいなら: http://hackage.haskell.org/package/ansi-terminal
0720デフォルトの名無しさん2014/02/09(日) 23:38:28.96
tasty-rerun
じゃあかんの?
07217172014/02/10(月) 20:05:23.49
>>720
俺へのレスだったか、すまん気づかんかったわ

あかんも何も、tasty というテストフレームワークの存在を初めて知ったから、まだ分からん
tasty-ant-xml 使って jenkins とも連携できそうだから、ちょっと試してみるよ
07227172014/02/10(月) 20:35:59.86
>>720
使ってみたが分からんかった
tasty-rerun でどうやれば >>717 を実現できる?

--rerun-filter オプションで指定できる 4 つのオプションを組み合わせるってこと?
0723デフォルトの名無しさん2014/02/10(月) 22:58:24.76
>>719
調べてみたところ、出力なら ansi-terminal で十分であることが分かりました。

ただ入力側も扱いたいので ncurses を使おうとしましたが、
パッケージのインストール時に外部ライブラリとして ncursesw/ncurses.h が必要です。
私の使っている ArchLinux ではどうもこの ncursesw を使うのに一手間かかるようで、
その一手間がどういったものか情報が得られませんでした(ncurses.h 自体はある)。
正確に言えば、私が理解できる情報が得られなかったわけですが。

もう少し調べてたところ、vty というパッケージがあることが分かりました。
"vty is terminal GUI library in the niche of ncurses." とのことです。
これで行けそうな気がします。

アドバイスありがとうございました。
0724デフォルトの名無しさん2014/02/12(水) 02:04:22.00
ConduitのドキュメントがHoogleで引っかからないです。
でもHayooでは引っかかる。
みんなHayoo使ってるんですかね?
0725デフォルトの名無しさん2014/02/12(水) 07:16:28.78
(^o^)/ おHayoo-
0726デフォルトの名無しさん2014/02/12(水) 08:33:32.47
>>724
Hayooメインで使ってる。
でも、サービスがよく止まってるから、結果的にHoogleも併用してる。
0727デフォルトの名無しさん2014/02/12(水) 15:23:24.76
Hoogleはローカルで動かすもんだろ
0728デフォルトの名無しさん2014/02/12(水) 21:51:44.15
~.cabal/config 編集して
documentation: True
にしてから
cabal install world --reinstall
すると、ドキュメントもローカルに落とせるんですね、、知らなかったです。
これをhoogleコマンドから引けたらもっといいんですけど、どうすればいいのかよくわからない…
0729デフォルトの名無しさん2014/02/12(水) 22:37:44.60
自分の環境では"hoogle data"と打ち込むだけでHoogleのインデックスが作られるけど、確かcabal側の操作が他にも必要だった気がする
0730デフォルトの名無しさん2014/02/13(木) 12:02:34.01
Haskellでゲーム作って(真似て)みたよ。
字幕をONにして見てね。
http://www.youtube.com/watch?v=ABsutPSLuqQ
0731デフォルトの名無しさん2014/02/13(木) 23:18:36.85
*>とか<*の使いどころって、どこ?
0732デフォルトの名無しさん2014/02/13(木) 23:43:40.46
すごいなー 1500行でつくれちゃうのかー
本家はjavaだっけ?処理速度的にどうなのか気になる
0733デフォルトの名無しさん2014/02/14(金) 00:52:31.90
Haskell は純粋関数型で、副作用が排除されてるから融合変換はかなり豪快に出来るって聞いた。
ただ細かな部分での最適化はそれほどでもないみたい?
0734デフォルトの名無しさん2014/02/14(金) 00:58:45.26
親父から授かった遺言は、haskellを極めろ
0735デフォルトの名無しさん2014/02/14(金) 01:00:44.40
>>730
コード見たい
0736デフォルトの名無しさん2014/02/14(金) 01:11:56.29
>>735
完成したら公開する予定って G+ で言ってる
0737デフォルトの名無しさん2014/02/14(金) 08:25:47.90
>>732
書きなぐった感じで作ってもそれぐらいだったよ。
偉い人が書くと余裕で半分以下になると思う。

処理速度は他言語で似たようなもの作ったことないから
比較できない・・・。

ただ、直感的にFortranと比べると若干遅い気がする。
表面に出るブロックだけピックアップして描画してるんだけど、
ピックアップするときに50万ブロックの走査したら数秒かかったw

>>733
今回のコードは8割以上IOモナドに浸食されてるんで・・・。

>>735-736
動画の最後でも言ってるんだけど、やはり大方の人に
最後まで見てもらえてなさそうだなw
0738デフォルトの名無しさん2014/02/14(金) 12:28:32.57
>>737
動画最後まで見たけど、早送り気味で見たから。
0739デフォルトの名無しさん2014/02/14(金) 13:05:58.50
>>738
そっか。
最後までみてくれてありがとう。
0740デフォルトの名無しさん2014/02/14(金) 13:09:34.88
>IOモナドに侵食
それでも別に融合変換は出来るのでは?
0741デフォルトの名無しさん2014/02/14(金) 13:56:47.97
>>740

>>733の副作用に条件反射して答えちゃいました

そもそも融合について名前程度しかしらなかったので
「関数プログラミングの楽しみ」やRWHの該当箇所を
流し読みしてみた。

でも、アドレス変換して値を参照してるところを直値を
直接参照して計算するようにプログラムを変換してくれ
るのかな・・・程度にしかわからなかった orz

もしその理解で正しいなら、この技法を取り入れたら
かなり早くなりそう。

難しいことは避けてきたけど、そろそろ真面目にHaskell
を勉強します・・・ m(_ _)m
0742デフォルトの名無しさん2014/02/14(金) 23:45:37.62
え、融合変換って最適化コンパイル時のコード置き換えでごにょごにょやって高速化する奴じゃないの?

直接参照云々はUNPACKのことかな。これも確かに高速化に繋がるけど、融合変換とか副作用とかとはあんまり関係ない
0743デフォルトの名無しさん2014/02/15(土) 00:33:12.68
>>742
説明の仕方が悪かったです。

中間のデータ構造を省いて必要な値を直接参照するように変換するような
もののような気がします。
例えば、以下のようなデータ構造があって、ある関数が特定の箇所を
走査する場合に以下のように変換するようなイメージだと理解しました。

data Aaa = Aaa { bb :: Double, cc :: Bool}

func :: [Aaa] -> Double
func aaa = foldl (\ s (Aaa {bb=d}) -> s + d ) 0 aaa

この関数を以下のように変換してくれる?

func aaa = foldl (+) 0 aaa'
where
aaa' = map (\ Aaa {bb=d}) -> d) aaa

UNPACKとの違いはよく分かりません・・・。
0744デフォルトの名無しさん2014/02/15(土) 00:43:05.59
補足。

>>743では変換後もリストを使ってますが、そのリストが直値の配列
になってるような感じだと思いました。

上手く説明できずスミマセン。

コンパイラの最適化で自動的にやってくれることのような気もします・・・。
ただ、副作用の有無は最適化時に重要になってくるような気もします・・・。
0745デフォルトの名無しさん2014/02/15(土) 01:02:57.59
副作用に汚染されてても融合変換ってうまくはたらくんだっけ?
0746デフォルトの名無しさん2014/02/15(土) 08:14:19.73
>>743
逆じゃね?
0747デフォルトの名無しさん2014/02/15(土) 12:55:05.47
>>745
結局のところ、どうなんでしょう・・・。
ただ、副作用があると難しそうですよね。

>>746
言わんとしてることは分かります。
たぶん、会話が噛みあってないだけだと思います。
0748デフォルトの名無しさん2014/02/15(土) 13:12:05.42
総合政策学部みたいなヤツがHaskellコード書いてるのを見ると、
よっぽど暇な学科なんだろうなって思う
0749デフォルトの名無しさん2014/02/15(土) 13:26:34.99
世界をコードで動かそうとしてるんだろ
0750デフォルトの名無しさん2014/02/15(土) 13:41:28.47
なんかかっこよさそうだから、そのうちHaskelやってみようつと。
「僕、今ハスケルで君の美を表現してるんだ」
これで芸大女ともやれるな
よぉぅしっ
0751デフォルトの名無しさん2014/02/15(土) 13:49:04.85
嫌味ね
0752デフォルトの名無しさん2014/02/15(土) 13:58:18.44
もちろん青春は遅延評価です
0753デフォルトの名無しさん2014/02/15(土) 14:00:19.63
大学で微積や応用数学の演習問題をガリガリ解いたのが、すっごく無駄な時間に思えてきた
0754デフォルトの名無しさん2014/02/15(土) 15:01:07.79
ムダでしょ(~_~;)
いまどきスマホのCASでもできちゃうから
■ このスレッドは過去ログ倉庫に格納されています