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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2017/01/15(日) 23:43:54.28 ID:Vh4eztBk.net]
関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)
www.haskell.org/

前スレ
関数型プログラミング言語Haskell Part28
echo.2ch.net/test/read.cgi/tech/1428597032/

511 名前:デフォルトの名無しさん mailto:sage [2017/05/2 ]
[ここ壊れてます]

512 名前:0(土) 20:25:36.74 ID:HYrvvmg5.net mailto: ん?
もしかしてread関数みたく型指定したらいけるって事け?
テキストに行番号振るナンバリング関数で数字と文字列のタプル受け取って文字列返すラムダ式をconcat[show x,str]から書き換えたらエラー出たんだけど、型指定で行けるなら再挑戦して見るかな。。。
[]
[ここ壊れてます]

513 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 20:37:45.54 ID:/vBlyS11.net]
printfはほんと実装どうなってんのって感じ

514 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 20:41:46.24 ID:HYrvvmg5.net]
実装自体はHoogleで調べたら見れるけど、見ても分からんかった記憶がある。

515 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 21:15:44.41 ID:ZfDONXvK.net]
a=>PrintfArg、b=>PrintfTypeのとき、
String -> bはPrintfTypeである
a -> bもPrintfTypeである
StringもPrintfTypeである
IO ()もPrintfTypeである
…を繋ぐと動くんだったかな

516 名前:デフォルトの名無しさん [2017/05/21(日) 06:36:57.09 ID:YZtqITyu.net]
型指定で行けたわ。
>>504thanks!!

import System.Environment
import Text.Printf

-- 数値型を文字列型に変換して文字列の頭に追加
consNum::(Int,String) -> String
consNum (x,s) = printf "%4d:%s" x s

-- 文章の行ごとに番号を振る
numbering = unlines.(map consNum).(zip [1..]).lines

-- ファイル名と内容(行番号付き)のタプルを作る
zipFile_Content f = (zip f).map numbering

-- ファイル名とファイルの内容を表示
putFile_Content (f,c) = printf "%s\n%s" f c

main = do
args <- getArgs -- コマンドから与えられたファイルのリストを受け取る
cs <- mapM readFile args -- 全てのファイルの内容を読み込む
mapM_ putFile_Content $ zipFile_Content args cs -- 全てのファイルのファイル名と内容(行番号付き)を表示

517 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 06:53:36.19 ID:YZtqITyu.net]
この長さならputFile_Contentをラムダ式に戻しても良いな。

518 名前:デフォルトの名無しさん mailto:sage [2017/05/21(日) 07:21:47.89 ID:NQzGLOFd.net]
>>506
可変長引数の仕組みはこんな感じ
class Count r where count :: Int -> r
instance Count Int where count n = n
instance (Count r) => Count (a -> r) where count n = const (count (n+1))
countArgs = count 0
main = print $ (countArgs 1 True "a" :: Int)

519 名前:デフォルトの名無しさん [2017/05/22(月) 19:08:38.92 ID:5O5zI7xX.net]
>>511
これcountArgは型推論で型解決されてるの?



520 名前:デフォルトの名無しさん [2017/05/22(月) 22:52:47.32 ID:8pBxEsLa.net]
1 2 3みたいなコードのエラーメッセージを見るに
関数適用で引数分の関数だと推論されるんだろうね

521 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 10:24:38.23 ID:3W0XlzKr.net]
Haskell - GHC for iOS : iOSアプリをHaskellで開発する
blog.euphonictech.com/entry/2015/01/26/210101

GUIはObjective-Cに任せて中身はHaskell。
テーブルゲーム系は作りやすい言語だから、案外向いてるかも。。。

522 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 14:48:19.87 ID:f1Q/bDWm.net]
Androidは?

523 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 17:25:53.49 ID:PJIONmxy.net]
haskell androidでググったらトップで出るお。
Ubuntuなら最初の辺りは省けそう。
cabalじゃなくてstack入れた上でcabalへのパス通す方向で行った方が失敗少なそう。

524 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 19:23:10.81 ID:jde/WziY.net]
ghc ios弄ってるよ。
7.8のghcは32bits版はghc公式のサイトにある。64bits のghc iosバイナリは公開されてない。
Appleのお達しにより64bitsを同梱しなければApp Storeにリリース出来ない。
HEADは試してないけど、3/27のソースではビルドは通った(ちなみにそのソースでは32bitsは素直に通らない)。
64bits のghc iosは現在活発にメンテされているようです。

俺は今は make binary-dist (つまり、ghc-....tar.xzを作るやつ)と、stackを直しています。
stackはcross compiler対応してないので、改造が必要なんだ。stack setup --os ios で一発インストールできるとこまで持っていきたい。

> cabalじゃなくてstack入れた上でcabalへのパス通す方向で行った方が失敗少なそう。
そのワークアラウンドは思いつかなかった。詳しくおしえてくれませんか。

525 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 19:32:03.75 ID:5hEoQuZK.net]
え、cabalって書いてるところをstackに置き換えるけど、パス通す時cabalへのパスって言う、非常に単純で頭の悪いやり方だが。。。
単純にcabalが依存関係で止まる確率下がらないかなぁと。

526 名前:デフォルトの名無しさん mailto:sage [2017/05/23(火) 22:54:19.25 ID:jde/WziY.net]
>>518
なるほど。俺が勘違いしているのでなければ、
ipx.hatenablog.com/entry/2015/05/02/093634
のページのajhcをcabal install するときの話ですね。
うちの環境はMacなのでためせないのだけど、hackageにあるajhcのcabalファイルをみると依存パッケージのバージョン指定がほぼ無いので、ひょっとするとビルド通るかも。
少なくともstackの方がcabalよりは可能性高そうですね。

スマホ開発について、俺はajhcを使うアプローチは試してないのですが、他にもGHCjsを使ってjavascriptに落とした後、
PhoneGapとかで埋め込む、って手もありそうです。

527 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 00:32:17.87 ID:NrN6swuV.net]
GHCjsなんてあったんだ。。。
fayってのはどこかのブログで見かけたけど。

528 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 21:57:13.55 ID:NmDuToTQ.net]
数値が書かれた文字列の大きさを比べたりソートするときってIntに変換しなくても大丈夫?

529 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 22:29:07.75 ID:yk/rwiNc.net]
いける
hackage.haskell.org/package/NaturalSort
hackage.haskell.org/package/naturalcomp
とか読んでみたら



530 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 22:31:16.66 ID:yk/rwiNc.net]
ただし後者は…読めない

531 名前:デフォルトの名無しさん mailto:sage [2017/05/24(水) 22:54:24.29 ID:YpWp2KMv.net]
a="1000"とb="999"を比べるとして、
頭から3桁目までを比べるとbのほうが大きい
けどaにはまだ続きがあってbには続きがない、だからaが大きい
こんなアルゴリズムだったような

532 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 00:11:42.62 ID:izfj8ylF.net]
>>521
辞書式順序になる。

“1000” < “200” < “30” < “4”

みたいに。

533 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 00:33:59.08 ID:Q9+DetqO.net]
>>521
変換しないと悪魔でも文字列としてソートするよ?
["10","100","20"]

534 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 00:46:54.13 ID:ZBW/Sl3S.net]
みんなありがとう
read :: String -> Intって書くのがめんどくさくて楽したかっただけなんだ
めんどくさがらずにちゃんとやるよ

535 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 01:31:24.27 ID:fGPRo4Tg.net]
naturalcompを入れた場合、
Prelude> :m +Data.List Text.NaturalComp
Prelude Data.List Text.NaturalComp> naturalComp "1000" "999"
GT
Prelude Data.List Text.NaturalComp> sortBy naturalComp ["1","99","1000","10","999","9"]
["1","9","10","99","999","1000"]
だいたい思ったとおりになると思うが

536 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 09:09:45.17 ID:ob559wKW.net]
>>527
ごめん。
>>522に出てたの知らなかった。
>>522のライブラリ使えば問題無いみたい。

537 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 11:03:59.19 ID:izfj8ylF.net]
>>529
こんな簡単なことで外部ライブラリに依存とかしたくないでしょ

538 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 11:22:28.03 ID:jD8c7u6v.net]
まあねぇ。
んじゃあ桁ごとにグループ分けして、それぞれをソートして、その後結合?

539 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 11:41:35.46 ID:XfbQ4lvY.net]
>>530
俺は大いに依存(利用)して問題ないと思う。

勉強も兼ねてるなら自作を勧めるが。



540 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 13:06:15.57 ID:jD8c7u6v.net]
昔のHaskellの(1+n)形式の引数復活しないかな。。。
代数的データ型で自然数作ったりの時、普通の関数だとこう。みたいな整合性が取れないのがね。。。

type Nat = Succ(Nat) | Zero

dec (succ(n)) = n

dec(Succ(Zero))
>Zero

dec (1 + n) = n
dec 1
>0

541 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 14:02:18.77 ID:XfbQ4lvY.net]
>>533
どんな時に代数的データ型で自然数を作るの?

542 名前:デフォルトの名無しさん mailto:sage [2017/05/25(木) 18:02:15.54 ID:KkJBSxnE.net]
お遊びの時。
だから無くても困らないけど、昔あったの知ってると復活しないかな。。。と。

543 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 00:23:29.72 ID:lBtW1IaY.net]
{-# LANGUAGE NPlusKPatterns #-}

544 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 02:18:52.31 ID:NvS9muX6.net]
何!!
復活の呪文あるんか!!

545 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 03:26:42.35 ID:NvS9muX6.net]
dec (n + 1) = n

は通るけど

dec (1 + n) = n

は通らない。。。
なんかモヤモヤ。。。

546 名前:デフォルトの名無しさん [2017/05/26(金) 06:58:01.57 ID:57q7qnDF.net]
Haskellerこっわ
https://twitter.com/ncaq/status/867682756821565441

547 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 07:45:17.70 ID:npmNm3qp.net]
NPlusK ゆうとるやろが

548 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 08:02:14.29 ID:BGbWYOFh.net]
だからKPlusNを追加したら、ンなもんねーよって怒られた。。。
あるだけ有難いけどね。

549 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 08:07:54.48 ID:BGbWYOFh.net]
>>539
Haskell使いって入ってるだけで、コードも何も語ってないやん。
はてなのHaskellerは優秀で良い人ばかりだお。
おいらは優秀じゃないし、プログラミング自体からほとんど引退してるからやめたけど。



550 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 08:24:06.27 ID:KgVkYaTe.net]
突然の自分語り

551 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 09:52:10.14 ID:x3L8qn59.net]
Haskellのプログラミングで金をもらう
Haskellerなる人物に何人も合ったが、
精神科通いとかの頭のオカシイやつばっかだった。
たまたまなのかも知れんが。

552 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 10:07:05.22 ID:lBtW1IaY.net]
両方名うてのキチガイやないかw

553 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 10:08:41.81 ID:lBtW1IaY.net]
ちなみにHaskellerがおかしいというよりは
CS業界が全般に発達障害とキチガイに寛容なだけ

554 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 10:25:10.56 ID:NDbIiRhl.net]
東大京大

555 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 10:47:10.88 ID:NDbIiRhl.net]
>>539
片方はGHCの機能追加してるガチ勢だぞ
単純な言語拡張も知らない分際でコード語ってないとかのたまってるやつ恥ずかしすぎる

556 名前:デフォルトの名無しさん mailto:age [2017/05/26(金) 11:08:43.28 ID:7I4ytZjC.net]
fumieval知らないとかモグリにもほどがある
自称関数型コミュニティでは超有名人

557 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 11:51:40.04 ID:lBtW1IaY.net]
>>548
>片方はGHCの機能追加してるガチ勢だぞ

そうだっけ?
なんかしょうもない型クラスのインスタンス追加して喜んでた記憶しかないわ

558 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 12:25:49.52 ID:npmNm3qp.net]
なにかHaskellにはそういう魔力めいた魅力でもあるのでしょうか

559 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 14:22:36.33 ID:ck4pDWmC.net]
関数脳になるとHaskellが癖になるのは確か。

オブジェクト指向のメソッドチェーンも入力->出力の連鎖で、関数型と同じなんだけど、ループや分岐も再帰やパターンマッチで書くから、より入力->出力に専念出来る。
思考がシンプルになる。

オブジェクト指向も思考をシンプルにする事を目指してるけど、クラス作る側とクラス使う側で大きな溝が出来てしまった。



560 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 16:33:50.74 ID:kKmQOK+/.net]
良くも悪くも変人しかHaskellなんて覚えようと思わないからじゃないかな
明らかに文法が異質だもの
多分みんな人生で何度か「変わってるね」って言われたことあるはず

561 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 17:33:52.44 ID:ZKqulABJ.net]
変わってると言えば否定しないけど、どの言語にもおいらみたいなのは一部居るんじゃないかな。

強いて言えばPythonやRubyにさえも挫折したおいらがHaskellで色々書けるようになって、書けるようになってからはPythonやRubyでも書けるようになって、Cでも書けるようにもなった。
例えばRubyのeach_slice相当の関数はHaskellに存在しない。
(Hoogleで調べても無かった)
でも、動きを理解さえすればすぐに同じ動きの関数が書けた。
PythonやRubyは基本が手続き型言語だから、ライブラリを知らないとか、ライブラリに存在しない時に急に難しくなる。

おいらみたいに、LLでさえ手続き型言語で挫折した人がHaskellで出来るようになって、はしゃいでるとかは有るかもね。

562 名前:デフォルトの名無しさん [2017/05/26(金) 17:41:46.50 ID:57q7qnDF.net]
例の包丁Haskellerもそうだが、使っている奴は厨二病患者が多い
本当に厨二心をくすぐる言語なんだよ…
OCamlメインの俺としては変なのがこっちに吸われていて助かる

563 名前:デフォルトの名無しさん [2017/05/26(金) 18:45:55.29 ID:ZQcANW7U.net]
変数も引数なしの値を返す関数。
a = 1

モナドもセクションにすればただの関数。
import System.Environment

slice n xs | length xs < n || n <= 0 = []
slice n xs = ys:slice n zs
where
(ys,zs) = splitAt n xs

main = (>>=) getArgs (print.slice 2)

そういう意味で、mainすらも引数なしでプログラムの結果を返す関数。
全てが関数と型と値だけで考えられる。
厨二で上等。
一貫した考えが素晴らしいね。
煩わしさがない。

564 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 18:49:06.98 ID:sZfcErOL.net]
なぜ自分は変じゃないと思えるのか……

565 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 18:49:10.19 ID:ulIxfp/C.net]
OCamlはラクダだもんな。厨二病もクソもないw
OcamlとかClojureはコードが丸い印象。Haskellは何か尖ってるよね。

566 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 18:50:59.74 ID:40xXL869.net]
コメントが (* *) だからさ

567 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 19:01:21.32 ID:ZQcANW7U.net]
>>557
え、否定しないって言ってるじゃん。
認めてるじゃん。

568 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 19:40:17.16 ID:xBragGUI.net]
>>556
セクションは部分適用した二項演算子のことだぞ

569 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 20:51:35.80 ID:ovKX6RUR.net]
あれ、どっちもセクションじゃ無かったっけ?と久しぶりに調べたら。。。
前置き形式?で良いのかな?
これは済まんかった。



570 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 21:07:05.78 ID:lBtW1IaY.net]
>>553
>良くも悪くも変人しかHaskellなんて覚えようと思わないからじゃないかな
>明らかに文法が異質だもの

ML系のワリと平凡な文法なんだけどね

571 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 21:28:16.56 ID:TC/C61F7.net]
変な文法と言えばPrologとかJ言語とか

572 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 21:36:15.75 ID:ovKX6RUR.net]
>>558
OCamlもHaskellも同じML系なのにどうしてそう感じたんだろう?
おいらみたいな使ってるやつの印象ってだけだったり?
おいらみたいなのは少数派だよ。
声が大きいから、たくさん居るように感じるだけ。

573 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 21:41:20.55 ID:0YCuYapQ.net]
すみません、質問です
f :: a -> b と g :: a -> c があったときに
\x -> (f x, g x) に相当する関数はライブラリに用意されてますか?

574 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 22:01:30.73 ID:ovKX6RUR.net]
>>564
Jは聞いた事はあっても触った事すらないので何とも言えないが、Prologは昔の関数型言語の本では次世代言語として紹介されてたな。
実際触って見て可能性自体は感じるんだが、引数が大文字始まりじゃないとダメとか、計算式が=じゃなくてisとかが、とにかく愛せなかった。。。

Prolog得意の家系図関数も、Prologなら自動で関係を見つけるのをHaskellだと家系図をモデルとした仕様書いて、関係性のルール見抜いて仕様にして、そのまま家系図をデータ型に、関係性のルールを関数にする。

関数はルールの条件を箇条書きすればそのままパターンマッチの関数になる。
この辺が手続き型言語に対するアドバンテージであり、Prologに対して見劣りする所。

でも関係性のルールを見抜く作業と、関数作る作業が私にとっては楽しいのでそれで良い。

575 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 22:03:34.66 ID:EgTlEiWL.net]
>>566
Control.Arrow の (&&&) だ。

576 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 22:07:24.39 ID:ovKX6RUR.net]
>>566
型でHoogle検索して見ては?
探すより作った方が早そうだが。

dfunc f g x = (f x, g x)

577 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 22:16:23.90 ID:0YCuYapQ.net]
>>569
(a -> b) -> (a -> c) -> a -> (b, c) とかで検索しても出なかったんですが
検索の仕方が悪かったのかな

>>568
そんな関数があったんですね、勉強になりました
ありがとうございます

578 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 22:34:36.00 ID:ovKX6RUR.net]
>>568
演算子としての使い方分からなくてググったわw
ほへー。。。
Arrowって基本こう使うのね。
こりゃHaskell分かりにくいってなる訳だよ。

579 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 23:18:50.05 ID:npmNm3qp.net]
型シグネチャから利用法読み解くのはIQモンスターでないと無理
設計者の思想を語ってもらわないと



580 名前:デフォルトの名無しさん mailto:sage [2017/05/26(金) 23:54:53.85 ID:nlWdhydN.net]
結局>>566は解決したんかな。。。
用途に合わせて自作した方が早いし読みやすいと思うんだが。

格好いいからって過剰にArrow使ったりってのもなぁ。
もうそっちのが慣れてて早いんなら別だが。

581 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 00:13:32.94 ID:ChWjXNtT.net]
データフローを記述するようなコードならArrow使えばいい

582 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 00:28:51.27 ID:Cj0QDtYS.net]
そうね。
逆にxと関数のリスト二つ受け取って、(f x, g x)のリストを得るとかだと引数の順番好きに選べる普通の関数のが良いと思う。

dfunc x f g = (f x, g f)

なりそう言うラムダ式をmapのリスト二つ版(仮にmap2)を作って渡せば良い。

結局>>566が何をしたかったかによる。

583 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 01:16:44.64 ID:BlrnYoHB.net]
Control.ApplicativeのliftA2を使って
liftA2 (,) f g
でもいけるよ。

584 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 07:13:42.02 ID:BlrnYoHB.net]
昨日の事件について、意見を書いた
anond.hatelabo.jp/20140515010237

585 名前:デフォルトの名無しさん [2017/05/27(土) 08:54:38.45 ID:pQ5DUsdI.net]
>>539
頭悪い会話すぎて笑った

586 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 08:59:16.85 ID:ChWjXNtT.net]
>>576
>liftA2 (,) f g

あー、関数アプリカティブか。

587 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 10:15:02.70 ID:y8N3m0Nz.net]
>>572
型だろうが思想だろうが同じこと
コードを1行も書かなくても分かり合えるのはIQモンスターだけ

588 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 10:32:14.53 ID:C4ObyqB4.net]
おまいらが楽する分Haskellコンパイラの
作成が激ムズになる件。

589 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 10:59:01.67 ID:y8N3m0Nz.net]
>>573
格好いいからじゃなくて
Monadはカリー化を過剰に使ってるからタプルを使わない
だからタプルに関係のあるものはArrowの方に集まってくる



590 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 12:15:10.10 ID:yeXCnzln.net]
>>582
そういう理由で使われてたのか
理論的にArrowベースのことやってるのかと思ってた

591 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 12:23:21.54 ID:Vkpp8Cst.net]
>>533
succの逆はpredな
デクリメントではない

592 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 13:39:14.00 ID:zKKPdOe3.net]
****sucking の逆教えてや

593 名前:デフォルトの名無しさん mailto:sage [2017/05/27(土) 16:44:16.35 ID:ectnCudZ.net]
>>585
****vomit

594 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 01:36:41.46 ID:i0C/srSl.net]
ちょっ違うなVomit****だ

595 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 09:27:04.54 ID:s8SCebgh.net]
-rw------- 1 root root 13796 5月 25 23:39 /usr/share/man/man1/cabal.1.gz
ArchLinuxでcabalのmanが読めないのはなんかのいぢめですか?

596 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 13:11:13.15 ID:wvAEkP6f.net]
リストのn番目の要素をaからbに変えたリストを返す関数とかないですかね?
splitAtで分けてから加工してまた繋げればいいのかな

597 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 13:22:58.81 ID:Ga0OokE+.net]
>>589
ilist というライブラリに Data.List.Index.setAt :: Int -> a -> [a] -> [a] という
質問そのものの関数があるよ。

598 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 20:35:00.08 ID:Rx3nBVE8.net]
一目、効率悪そう

599 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 22:10:57.08 ID:3aZpEfHH.net]
元のリストを破壊することなく新しいリストを作るからね
不特定多数から参照されるデータは破壊できないから効率が悪い

所有権がないと参照できないような仕組みがあれば良いのか



600 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 22:31:00.36 ID:A2iCvXLz.net]
>>589
nとaと(x:xs)受け取ってnが0になったらxの代わりにaをcons(:)すればいい。

setAt _ _ [] = []
setAt 0 a (_:xs) = a:xs
setAt n a (x;cs) = x:setAt (n - 1) a xs

601 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 23:05:39.10 ID:Ga0OokE+.net]
>>593
それ、質問者の言う splitAt で分けてからっていう方法と同じ

602 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 23:14:43.47 ID:wvAEkP6f.net]
>>590
>>593

ありがとうございます
Data.IndexのsetAt関数の定義をそのまま使わせてもらおうと思います

603 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 23:23:12.14 ID:Rx3nBVE8.net]
リストのコピーって、(既にある)リストの各要素の格納先と同じアドレスを指すポインタを新規アロケートしてく感じですか?

それとも一々要素までをもコピーするんですか?

604 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 00:33:15.43 ID:21264BYs.net]
コピーしてたらリストの意味無いからアドレスを新しく指してるんだと思う。
でないと、ソートとかメモリ幾らあっても足りなくなる。

605 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 00:49:02.28 ID:21264BYs.net]
>>594
SplitAtで分けると前方がリストになる。
(++)と(:)じゃ(:)のが効率が良い。
(++)は前方のリストが長くなると著しく遅くなる性質がある。

606 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 01:12:03.29 ID:21264BYs.net]
>>594
ちなみにsplitAtのやり方だとtake n zsの一番最後が更新したい場所になるので、initした上で++[a]++ysする必要がある。

setAt n a zs = init xs ++ [a] ++ ys
.........................where (xs, ys) = splitAt zs

Haskellでswap関数を作る7つの方法とか言うページ思い出したわ。。。

607 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 01:13:40.94 ID:21264BYs.net]
x splitAt zs
o splitAt n zs

608 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 06:42:46.07 ID:0mYha2aU.net]
(++) (x:xs) ys = x : (++) xs ys
setAt n a (x:xs) = x : setAt (n-1) a xs

これを比較して前者が著しく遅いというのは嘘八百だな

609 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 06:59:53.71 ID:Ny51uA9N.net]
>>601
reverse関数をfoldl (\x -> x:ls) [] xsで書くのとreverse xs ++ [x]で作るのじゃ反転した文字列が生成される度に右から結合されて凄く遅い。

上の>>599も、init xs ++ [a]で一旦結合して、++ ysの部分に来たらまたinit xs部分から結合が始まる。



610 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 07:04:59.77 ID:Ny51uA9N.net]
あ、逆か。
ysから始まってリストの先頭まで結合する。

出力する際には結局先頭から(:)伝いに辿って行くのでそう言う二度手間は避けた方がいい。

611 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 07:20:56.98 ID:Ny51uA9N.net]
ここで言う問題は、++ysそのものに害は無いけど、init xs ++ [a]で一旦先頭まで結合する処理が挟まってるってことね。

612 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 07:35:03.41 ID:0mYha2aU.net]
実は++も右結合なんだよな
だから init xs ++ [a] ++ ys を (init xs ++ [a]) ++ ys と解釈するのは絶対ダメ

613 名前:デフォルトの名無しさん [2017/05/29(月) 07:35:56.11 ID:Dokhp7Id.net]
setAt i x xs = let (ys,_:zs) = splitAt (i-1) xs in ys ++ x : xs
別にこういう定義にすればいい
でこれが遅いのは単にysの部分が2パスになるから

614 名前:デフォルトの名無しさん [2017/05/29(月) 07:39:00.53 ID:Dokhp7Id.net]
>>606
ミス
x : xsじゃなくてx : zs

615 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 07:52:38.57 ID:KKAtyjp+.net]
別にそれでも良い。
(++)は取り扱い次第で遅くなるってだけ。

616 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 15:03:33.95 ID:2+2L65e+.net]
というわけで、Sequenceです

617 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 20:13:36.52 ID:0mYha2aU.net]
showで文字列を作るのは平気なのにリストを作ると遅い遅いと言われる現象
数学的というより人間工学っぽい

618 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 20:46:32.77 ID:VknhjnwZ.net]
出現頻度の問題では?

619 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 21:27:07.82 ID:0mYha2aU.net]
リストを使う頻度はIOを使う頻度と関係ありそう
IOを使う頻度は個人差が非常に大きい



620 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 21:54:24.18 ID:2+2L65e+.net]
初心者はモナド変換で躓く

621 名前:デフォルトの名無しさん mailto:sage [2017/05/30(火) 04:05:18.67 ID:jc1LxPHe.net]
例外処理のベストプラクティスがよく分からないなー
catchとかhandleでメイン処理、例外処理共に複数行になる時に、命令型のtry~catchみたいに無名関数での書き方ってどうなるんだろう
関数に切り出して呼ぶべし、なんかな?
どっちかだけ複数行ならそっちをdoにしたら良いっていうのは分るんだけど

622 名前:デフォルトの名無しさん mailto:sage [2017/05/30(火) 05:14:25.23 ID:jc1LxPHe.net]
パーレンで囲んだラムダは複数行いけるのな、見た目微妙だけど

623 名前:デフォルトの名無しさん [2017/05/31(水) 03:43:11.48 ID:ML3xxqnu.net]
パーレン ()
ブラケット []
ブレース {}

624 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 16:54:41.37 ID:c6fwatRb.net]
f g n = gをn回合成した関数
みたいな関数のが欲しい

625 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 17:14:18.00 ID:PKJ3i7am.net]
f = (!! n) . (iterate g)

626 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 18:46:29.60 ID:RovdiJA/.net]
>>618
それって真面目なコードで使っていいのか?
融合変換で実質ループなのは知ってるけど
そもそもこのレベルを勝手に抽象化していいものかどうか

627 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 20:14:20.72 ID:lhcAcbkl.net]
なんの問題もないと思うけど

そもそも同じ関数の反復適用が iterate なんだから
たいして抽象的でもない

628 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 20:24:38.74 ID:lhcAcbkl.net]
iterative f n = foldl1 (.) $ take n $ repeat f


これより >>618 の方がわかりやすいと思う

629 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 20:28:35.64 ID:lhcAcbkl.net]
iterative f n = foldl' (.) id . map (const f) $ [1..n]

とかでもいいか。そして iterate の方があきらかにわかりやすい。



630 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 00:13:00.20 ID:zJIyEnOK.net]
Cabalプロジェクトをstackでビルドできないだろうか?
cabalをグローバルにインストールしたくないんだ

631 名前:デフォルトの名無しさん [2017/06/07(水) 04:45:18.83 ID:WOFnqCYP.net]
haskellで○×ゲーム作りました(頑張った私を褒めてください)
https://ideone.com/HHEWZv

632 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 08:42:17.54 ID:gpLNw8mo.net]
勝利判定なんとかならんのかw

633 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 10:28:15.63 ID:ZiMqMUeJ.net]
ゲームとかアルゴリズムとかどうでもよくて、ここが可愛いってのがポイントだろ?

('o':'o':'o': _ : _ : _ : _ : _ : _ :_) -> True
( _ : _ :'x': _ :'x': _ :'x': _ : _ :_) -> True

634 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 17:37:30.82 ID:goEom//K.net]
下は泣いてるミッフィーちゃんがクローン技術で失敗したような感じ

635 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 22:12:38.86 ID:FEgyIbtW.net]
昔オセロ作ったけど、勝敗判定作るの忘れて延々パスし続けたわ

main =
    void $ loop (player >=> ai) initBoard
        where loop :: (Board -> IO Board) -> Board -> IO Board
              loop f ib = loop f =<< f ib

636 名前:デフォルトの名無しさん mailto:sage [2017/06/08(木) 02:06:09.79 ID:3NnY77Pk.net]
>>624
同じゲームでも人によって設計や実装が全然違ってて面白いな

○×ゲーム - a-sanの日記 - haskell
https://haskell.g.hatena.ne.jp/a-san/20070115/p1

yasuabe blog: Haskell で三目並べ (2)
yasutech.blogspot.jp/2012/03/haskell.html

examples/TicTacToe.hs
projects.haskell.org/operational/examples/TicTacToe.hs.html

TicTacToe - HaskellWiki
https://wiki.haskell.org/TicTacToe

Tic-tac-toe in Haskell ・ GitHub
https://gist.github.com/billdozr/3071732

637 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 01:46:27.90 ID:vYdG9fRO.net]
開発環境としてleksahを入れてみたんですが、getLineのような標準入力が上手く動いてない気がします
実行しても入力出来るようにならず止まってしまうのですが、どうしたら入力出来るようになりますか?

638 名前: mailto:sage [2017/06/11(日) 05:15:07.62 ID:afWo9qoQ.net]
今気づいた! leksah ってHaskell逆読みじゃん!

639 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 12:39:02.23 ID:hZZQfw5d.net]
月並な命名をされた月並なアプリ



640 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 16:52:05.15 ID:3HVnXb8h.net]
>>68
> ["aa", "bb", f ["cc", "dd"] ] =
> ["aa", "bb", "cc", "dd"]
> となるような関数fはどのように書けるでしょうか

めちゃ遅レスでなんだけど、f [x, y] = x : [y] ではだめなの?

641 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 17:45:34.43 ID:uxrAPwUF.net]
>>633
自分でちゃんとテストしてみた?

642 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 22:56:26.81 ID:3HVnXb8h.net]
>>634
リストの定義から明らかだと思うのでテストはしていない

643 名前:デフォルトの名無しさん [2017/06/11(日) 23:16:23.58 ID:0ffmynih.net]
>>635
リストの定義から明らかだが、>>69

644 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 23:46:34.97 ID:QTMXbNo3.net]
驚き最小=テスト最小の法則

645 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 23:54:46.06 ID:3HVnXb8h.net]
>>636
何と何の型がどう合わない?

646 名前:デフォルトの名無しさん [2017/06/12(月) 00:18:12.16 ID:9+UoMkQw.net]
テンプレート?

647 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 01:00:35.16 ID:p/7lEol5.net]
fを適用した結果の型が外側のリストの型と合わないってことでら

648 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 01:38:16.98 ID:0O7XnA5J.net]
たぶんshowの結果を評価する途中でunsafePerformIOすればいいんだな

649 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 01:46:50.84 ID:4tiz7p+p.net]
[ “aa”, “bb”, [“cc”,”dd”] ]

の型がどうやって合うと思ったのだろうか。



650 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 02:20:04.97 ID:DHBWzfrJ.net]
邪悪なことはするな

651 名前:デフォルトの名無しさん [2017/06/12(月) 02:47:23.94 ID:q+c9m0UT.net]
>>638
文字列型の中に文字列のリスト受け取って文字列を返す関数型が混じってる。

652 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 09:44:54.21 ID:4tNZZp5I.net]
>>644

それは違う。関数型が混じってるんじゃない。

>>642

["a", "b", ["c", "d"]]
= "a" : ("b" : ["c", "d"])
= "a" : ("b" : ("c" : "d"))
= ["a", "b", "c", "d"]

じゃないの?

653 名前:デフォルトの名無しさん mailto:645 [2017/06/12(月) 09:53:23.55 ID:4tNZZp5I.net]
>>642
自己解決しますたw nilをきちんと入れてなかったみたい。

654 名前:デフォルトの名無しさん [2017/06/12(月) 17:07:14.08 ID:uTHinYqc.net]
>>645
関数自体も値なのだが。。。
仮に返り値だとしても、文字列のリストにさらに文字列のリストが入ってるので型が合わない。

["a","b",["c","d"]]
="a":"b":["c","d"]:[] --["c","d"]が一つの値なので、文字列じゃない!!とエラーになる。

655 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 17:22:26.96 ID:pxvA8Fxv.net]
なんでここでnilの話になるんですか?

656 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 18:54:07.23 ID:rXVGv3m5.net]
どうしてもできないときは、それはする価値がないのだ

= 何かをしたくて、その手段としてそれをしようとしているが、実は何かはそれでなく別の方法でより自然に実現できることが多い。無理矢理その手段を開発する価値が本当にあるのか、もう一度考えてみよう

657 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 20:01:13.71 ID:4tiz7p+p.net]
GHCi で ["aa", "bb", ["cc", "dd"]] を評価してみれば一発だろうに

• Couldn't match expected type ‘Char’ with actual type ‘[Char]’
• In the expression: "cc"
In the expression: ["cc", "dd"]
In the expression: ["aa", "bb", ["cc", "dd"]]

658 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 21:30:08.56 ID:4tNZZp5I.net]
>>647
> ["a","b",["c","d"]]
> = "a":"b":["c","d"]:[] --["c","d"]が一つの値なので、文字列じゃない!!とエラーになる。

文字列または文字列のリストからなるリストというのはあり得るでしょう?
その場合ならエラーではないはず

>>649
> どうしてもできないときは、それはする価値がないのだ

いまの場合、どうしてもできない証明はどうするんだろう?

>>650
> GHCi で ["aa", "bb", ["cc", "dd"]] を評価してみれば一発だろうに

それだけではその評価が本当に正しいかどうかが分からない

659 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:36:06.43 ID:ejDn/VSN.net]
>>651
> 文字列または文字列のリストからなるリストというのはあり得るでしょう?

文字列というのが String 型を指していて、文字列のリストというのが [String] 型を指しているのであれば、
文字列または文字列のリストからなるリストという型は「あり得ません」。

なぜなら、Haskell には「型A または 型B」という型は存在しないからです。
(data T = D String | E [String] の型は T であって、D や E ではない)


> いまの場合、どうしてもできない証明はどうするんだろう?

なぜ「証明」を求めるのでしょうか。
Haskell だとこれはできないよと言われ、簡単な理由を説明された時、
あなたはいつもその証明を求めるのですか。
今回の問題に限って求めているのであれば、その理由を説明してください。
理由によっては、あなたが納得できる証明以外の説明ができるかもしれません。
というのも、できないことの証明を本当にしようとすると、かなり難しいからです。
きっと構文規則や意味論にまで話が及びます。
そんな証明できる人は稀ですし、できる能力があっても、したくないでしょう。


> それだけではその評価が本当に正しいかどうかが分からない

あなたの場合、「正しい」とは何を意味するのでしょうか。

>>650 が言っているのはきっと、GHCi で試してみれば「構文エラーであることが分かる」、
ということだと思いますよ。
それが正しいのか分からないというのは、GHC は信用できないということですか。



660 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:39:18.30 ID:4tiz7p+p.net]
>>651

https://paiza.io/projects/TpKm5_4fBEc7_YoKQIeKJQ

こういうのがお望み?
いずれにせよ List のデータコンストラクタ(:)を持ち出した >>633 は救済できんが。

661 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:48:23.36 ID:cqbaGfvU.net]
もしかして本当に欲しかったもの:
[["aa"], ["bb"], ["cc", "dd"]]

662 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:49:39.74 ID:4tiz7p+p.net]
https://paiza.io/projects/4geVOsfwAnMedzLfkbEDpw

こっちのほうがパラメータ多相でいいか。

663 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:58:41.14 ID:4tiz7p+p.net]
ちなみに、自分自身を要素の型とするかのような「ネストしたリスト」のようなデータ構造(というかinfnite typeのまがいもの)自体はときどき使いたくなるので簡単なライブラリを書いたことはある。そういやOCamlは オプショナルだが infnite type 扱えるんだったっけ??

664 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:23:51.05 ID:4tNZZp5I.net]
>>652
> なぜなら、Haskell には「型A または 型B」という型は存在しないからです。

「今のHaskell」には存在しないということね?
こっちは今のではなく本来のに興味があるので。

> Haskell だとこれはできないよと言われ、簡単な理由を説明された時、
> あなたはいつもその証明を求めるのですか。

簡単な理由でよいのだが、「今そうなってるから」は興味がない

> あなたの場合、「正しい」とは何を意味するのでしょうか。
> >>650 が言っているのはきっと、GHCi で試してみれば「構文エラーであることが分かる」、
> ということだと思いますよ。

さっきも言ったが、「今そうなってる」というのは 「正しい」とは異なる

665 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:32:25.99 .net]
方法が存在しないことの証明って悪魔の証明でないの?
できると主張する側ができることを証明しないとダメだよ

痴漢の言いがかりをつけられて、『痴漢していないことを証明しない限り有罪な』って裁判官に言われて納得できる?

666 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:39:48.75 ID:4tiz7p+p.net]
>>657はできるという根拠をコードで示せばいい。

Haskell 2010 に従ったコードで、しかしGHCが不当にも
型検査で排除するというような、そういうコードを示せば
話はたちまちに解決する

667 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:42:32.96 ID:4tiz7p+p.net]
[“aa”, [“bb”,”cc”]]

について Haskell2010 の構文規則をを充足するような
Haskellの型をつけてくれればいい

668 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:43:46.21 ID:ejDn/VSN.net]
>>657
みんな、特に断りがなければ今のHaskellについて質問したり語ったりしています。

なので、そうでなければ、初めにちゃんと断っておかないと、話が合わなくなります。

また、本来のHaskellとは何かも説明しておかないと、これまた話が合いません。

私は今のところ、今のHaskellでアプリを作ることに興味が向いているので、
そうではない議論からは抜けさせてもらいます。


>>658
方法の存在を仮定した場合に矛盾がおきることを示すことで、方法の非存在を示すやり方もあります。
数学(厳密な論理)の舞台に上げられるテーマであれば友好的な手です。
(面倒かどうかは別にして)

669 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:48:33.05 ID:ejDn/VSN.net]
>>661
うぁ、恥ずかしい、友好的な手って何だよ。

有効な手、ね。


>>659
彼、今のHaskellには興味ないそうですよ。



670 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:48:35.55 ID:PpCA4OTT.net]
定義の証明をしろってことか
1の次の数は2であることを証明しろ的な
つまり1=2は間違いとは言えないのだ

671 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:59:06.10 ID:4tiz7p+p.net]
>>663
>1の次の数は2であることを証明しろ的な
>つまり1=2は間違いとは言えないのだ

Succ 1 = 2 とか普通にPAで証明できるけど……

672 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 00:09:20.22 ID:kWBme6H8.net]
本来のHaskellってなんですか

673 名前:デフォルトの名無しさん [2017/06/13(火) 00:57:22.00 ID:12SNvyK/.net]
LISPベースのリスト

674 名前:デフォルトの名無しさん [2017/06/13(火) 11:30:18.72 ID:OES2L0YQ.net]
>>651
それぞれのリストはあるけど、両方の型を持ったリストはない。
リストがいっぺんに受け取れる型は一つだけ。

ghciで拒否られたらそれまでじゃね?
何か作りたいわけじゃないって事?
下で将来のHaskellとか語ってるっぽいけど、今作れないでいつ作るの。

>>645見るに最終的に欲しいのは

["a","b","c","d"]

だろ?

f ["a","b"] ["c","d"]
= ["a","b"] ++ ["c","d"]
= ["a"] ++ "b":["c","d"]
= [] ++ "a":"b":["c","d"]
= ["a","b","c","d"]

じゃあダメなのか?
手段にこだわるより、目的果たす事考えようぜ。

675 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 12:23:55.30 ID:JgnP6kSF.net]
>>658
> 方法が存在しないことの証明って悪魔の証明でないの?

そんなことないよ。不可能性の証明なんて数学では普通にあるでしょ

>>661
> 特に断りがなければ今のHaskellについて質問したり語ったりしています。

スレタイは「今の」とはなっていない。「今の」「Haskell」に限るとつまらない
「関数型プログラミング言語」 の方がおもしろい。ここは「関数型プログラミング言語」がテーマと認識している。(俺はね)
「今の」「Haskell」は単にその一つ

> また、本来のHaskellとは何かも説明しておかないと、これまた話が合いません。

本来の関数型プログラミング言語程度の意味。それはみんな意識してるでしょ?

>>667
> それぞれのリストはあるけど、両方の型を持ったリストはない。

それは今のHaskellについた制限のようなものでしょ?

> f ["a","b"] ["c","d"]
> = ["a","b"] ++ ["c","d"]
> = ["a"] ++ "b":["c","d"]
> = [] ++ "a":"b":["c","d"]
> = ["a","b","c","d"]
>
> じゃあダメなのか?

それではもとの問題と違うし、スマンが興味わかんわ

676 名前:デフォルトの名無しさん [2017/06/13(火) 13:10:39.07 ID:s+JNd9SI.net]
>>668
将来も今も["a","b","c","d"]は[String]って型で表現できるけど、
["a","b",f ["c","d"]]はどういう型で表現するのさ?
こう表現出来るってのが無いと、ただ単に型に対する意識が低いだけのお馬鹿さんだよ?

677 名前:デフォルトの名無しさん [2017/06/13(火) 13:17:22.94 ID:s+JNd9SI.net]
大体、複数に型を纏めるんならタプル使えよ。
(["a","b"], f ["c","d"])
fが部分適用してない、値を返す関数なら結果の型が入るし、部分適用で関数としてタプルに入ってるなら何か受け取って何か返す関数の型がタプルにに入る。

678 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 14:08:02.45 ID:pIEcxV3Y.net]
nilわすれてるってのはさ、
[a, b, c, d] と a : b : c : d : [] が等価ってことでさ、
この末尾の:[]を忘れたらあかんってことじゃないの?

679 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 14:26:42.82 ID:JgnP6kSF.net]
>>669
そこのfはどういう関数型という想定?



680 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 15:33:15.95 ID:kWBme6H8.net]
自分の間違いを認められず引くに引けなくなってるだけなんじゃないの

681 名前:デフォルトの名無しさん [2017/06/13(火) 18:11:35.28 ID:XoC5HvTL.net]
>>672
>>668に聞いてくれ。
そもそもどんな型でも文字列が返ってくる以外は入れられない。

f = concat

["a","b",f ["c","d"]]
=["a","b","cd"] --これは>>668のやりたいことでは無い。

こう言うの以外は現行で受付られないが、それ打破するリストの型表現が存在出来るなら、将来実装されるかもな。

682 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 18:19:50.97 ID:pvAx0DQv.net]
fは引数でもない外側のリストを無理やり拡張するのか……おぞましいな
そんな実装されたらHaskell見限るわ

683 名前:デフォルトの名無しさん [2017/06/13(火) 18:35:46.29 ID:XoC5HvTL.net]
だよな。
だからこそmapとかの関数作りやすいのに、そんな変な機能将来に渡って欲しいとは思わん。
入力->出力が素直だからこその関数プログラミングだってのに。
欲しい最終データが手に入れば良いのに、>>668は手段と目的が逆転してんだよ。

684 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 19:30:15.82 .net]
どうしてもそれができないときは、本当にそれが必要不可欠なのか、もう一度よく考えてみよう

685 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 21:22:18.24 ID:JgnP6kSF.net]
>>669
> ["a","b",f ["c","d"]]はどういう型で表現するのさ?
関数fの型によるけどその出力がStringなら["a","b",f ["c","d"]] の型はもちろん[String]だね。

>>674
> そもそもどんな型でも文字列が返ってくる以外は入れられない。
結局、今のHaskellでは、["a", "b", ["c", "d"]] のような表現はできないと言ってるだけね?
関数型言語としてなぜそんな表現力を制限するのか分からん。どういう場合に使いたくなるかは知らんが。

>>676
> 入力->出力が素直だからこその関数プログラミングだってのに。
入力->出力が素直ってどういうこと? 自然変換のことじゃないよね?www
関数プログラミングは入力->出力になってればそれで十分だと思うが

>>68
> ["aa", "bb", f ["cc", "dd"] ] =
> ["aa", "bb", "cc", "dd"]
> となるような関数fはどのように書けるでしょうか

結局もとのこの問題について、“一般の関数型言語”でのfの不可能性をだれも論証できないのかな?
(要点さえ分かれば簡略でよいが)

686 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 21:34:21.04 ID:BDZwTNDo.net]
型は単に「欲しい最終データが手に入ればよい」っていうよりは
ある種の性質がコンパイル時に保証されてるってのがありがたい
エンバグも検出しやすい

他の言語だと[Any] なListがあったりするけど(例えばScala)
よくあんなの使うなーって思う

>>678
> ["aa", "bb", f ["cc", "dd"] ] =
> ["aa", "bb", "cc", "dd"]
これはリテラルでこう書いてる以上、 fがどんな値を返そうと
左辺は要素が3のリストで右辺は要素が4のリストだから
パターンマッチに成功するわけない

687 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 21:39:23.64 ID:Qd0f53fz.net]
>>678
ここにいる人たちは俺もあんたも含めて誰も証明できないことは、
いままでの一連のレスですでに分かっているはず。

あんたの投げかけた議論に誰もあんたの望むようには応えられないことも分かっただろ。

あんたの話はhaskellという小さな枠組みを遥かに越えてるんだよ。
いい加減スレチだってことに気づこうよ。

頼むから、一般の関数型言語における可能性や証明の議論は大学でもっと頭のいいヤツらとしてくれ。

688 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 21:43:22.47 ID:RNIsqaqt.net]
中途半端な数学屋なんて全然怖くないのに
数学系と聞いて逃げるHaskellプログラマ大杉

689 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 23:14:18.88 ID:qhE8awpR.net]
とりあえずこんなもんでどう?
https://ideone.com/wMOghJ



690 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 23:32:43.89 ID:qhE8awpR.net]
どうせならFoldableにすりゃよかったな
ま、いっか

691 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 23:59:28.85 ID:pYqK9vAB.net]
Haskell の枠組みにとらわれないなら、自分専用関数型言語の
文字列リテラルを 682 が示した Nest みたいに自由に定義すればいいもんな

これで解決だ

692 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 00:01:03.56 ID:ZT/uD64c.net]
ideoneやpaiza.ioのようにhaskellコードのコンパイルと実行を同時にしてくれるようなローカルアプリはありますか?
補完とかはなくてもいいですし、exeも生成しなくていいのですが

693 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 00:24:00.03 ID:VydZF3sS.net]
["aa","bb",f["cc","dd"]]=["aa","bb","cc","dd"]なるfが存在しないことは、
チャーチ・ロッサー性で説明できる。

チャーチ・ロッサー性は、簡単に言うと、計算の順番を変えても
最終的な計算結果が変わることが無いという性質。

もし上記のようなfがあるとすると、以下の2つの式の計算結果が同じでなければならない。
なぜなら、これら2つの式は、一番内側のfを先に計算するかどうかの違いしかないから。

null(tail(tail(tail ["aa","bb",f["cc","dd"]])))
null(tail(tail(tail ["aa","bb","cc","dd"])))

しかし、計算すればわかるが、上はtrueで下はfalseになるので矛盾する。
よってfは存在し得ない。

本当は、型なしラムダ計算に落としこんでからやる必要があるけど、
(型なしラムダ計算にチャーチ・ロッサー性があることは証明済み)
骨子としてはこんな感じ。

694 名前:デフォルトの名無しさん [2017/06/14(水) 00:35:10.46 ID:Ei72hKB9.net]
要するにLispのマクロの ,@ みたいな展開をしたいってことか?

695 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 02:36:17.24 ID:jR7LtVt0.net]
>> 683

まあ、こういうデータ構造なんか既視感あるよなと思ったら、リストじゃなくてツリーだよね
つうか Data.Tree がまんまそれ

696 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 05:34:36.84 .net]
>>681

この人強そう

697 名前:デフォルトの名無しさん [2017/06/14(水) 09:21:04.82 ID:Zur2LRZk.net]
>>678
>関数fの型によるけどその出力がStringなら["a","b",f ["c","d"]] の型はもちろん[String]だね。

そこまで分かってて、f ["c","d"]が単一のStringにならざるを得ない。
つまり

["a","b","c","d"]

ではなく、

["a","b","cd"]

の様な単一の値としてしか返りようがないって分かるだろ。
あれか、複数の値を返せってか。
従来の値が欲しい方はどうすんだよ。

698 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 09:53:35.84 ID:dwFQOh88.net]
>>679
> 他の言語だと[Any] なListがあったりするけど(例えばScala)
> よくあんなの使うなーって思う
その例は極端すぎる。Anyは論外。型の否定と

699 名前:ッじ。(Scalaも推奨はしてないと思うが)

> fがどんな値を返そうと左辺は要素が3のリストで
ふつうに考えてそうだよね。
そこを以下のように暗算して、できるかと思っちゃった。
f[x, y] = x : [y] とすると、
[a, b, f[c, d]] = a : b : (c : [d]) = a : b : (c : d : []) = a : b : c : d : [] = [a, b, c, d]

>>680
というわけで、ここは俺が暗算で頭の体操してミスってた。
優しく拒否してもらったがスマンw

>>686
> ["aa","bb",f["cc","dd"]]=["aa","bb","cc","dd"]なるfが存在しないことは、
> チャーチ・ロッサー性で説明できる。
折角だが今の件はチャーチ・ロッサー性(合流性)は関係ないと思う。
合流性以前の到達性が問題なので。
[]
[ここ壊れてます]



700 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 12:36:58.87 ID:P8yIezdD.net]
配列xsとysと引数を2つ取る関数gがあって、
f g xs ys = map (\x -> map (g x) ys ) xs
となるような関数fってあったりしますか?
例えば
f (+) [1,2,3] [4,5,6] = [ [5,6,7], [6,7,8], [7,8,9]]
となるような関数です

701 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 12:50:16.34 ID:aJwV86NO.net]
>>692
hoogle で調べてみても、それっぽいものが見当たりませんね。
少なくとも標準ライブラリにはありません。
なので、その定義に自分で適当に名前を付けて使ってください。

702 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 12:56:47.67 ID:P8yIezdD.net]
>>693
ありがとうございます
ないならないで問題ありません
たまに使うのですが、既にあるならわざわざ定義するのも無駄だなと思っただけなので

703 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 15:28:29.26 ID:sgvQsVTs.net]
>>692

f g xs ys = concatMap (¥x -> map (g x) ys ) xs

でいいなら(つまりリストを1段階潰していいなら)あるよ。

g <$> xs <*> ys

がその答え。

704 名前:デフォルトの名無しさん [2017/06/18(日) 17:41:11.73 ID:VE2N9ory.net]
>>692
zipWithに配列の配列渡せば行けるか?と書いてみた。

zipWith (map.(+)) [1,2,3] $ repeat [4,5,6]

うん。
素直に関数作った方がいいね。
リスト内包表記なら分かりやすいと思う。

f g xs ys = [map (g x) ys | x <- xs]

705 名前:デフォルトの名無しさん [2017/06/18(日) 17:41:54.37 ID:VE2N9ory.net]
x配列の配列
oリストのリスト

706 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 22:40:07.66 ID:3urB1Yg8.net]
これで行けるよ。
f x = fmap . (. (:[])) . liftA2 x
f (+) [1,2,3] [4,5,6]
[[5,6,7],[6,7,8],[7,8,9]]

707 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 05:32:16.99 ID:DP5W49kg.net]
そういう関数ってすでにある?って質問なのにオレオレ実装載せてく人たち…

708 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 06:40:21.02 ID:iu3OXdki.net]
しかも、質問者の実装が一番素直で分かりやすい

709 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 07:45:05.62 ID:f7LtpRLv.net]
隙あらば実装

いや、プログラム板ではそれでいいんじゃないか。



710 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 10:22:09.65 ID:Gx/WCs0N.net]
組み込みの関数でラムダ式を隠蔽してしまうことには意味があるんじゃないか

ところで質問者の例だと結果が可換なのでそうじゃない例の方が良かったのでは
f (+) [1, 2, 3] [1, 3, 5] -> [[2,4,6],[3,5,7],[4,6,8]]
f (+) [1, 3, 5] [1, 2, 3] -> [[2,3,4],[4,5,6],[6,7,8]]
とか

711 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 10:46:07.27 ID:6iW/OLTz.net]
>>702
それならば、あなたはどのような意味を見いだしたのかまでちゃんと言わないと。
何にどのような意味を見いだすかは人それぞれですし。

私は、ソースは人間が読みやすい事に最大の意味を見いだします。
なので、計算結果を容易に想像できるという点で、
>>692 や >> 696 の下の定義は好きですね。

712 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 02:37:46.49 ID:JHLae2yG.net]
IOモナドは命令書という喩えが一番しっくり来た

713 名前:デフォルトの名無しさん [2017/07/01(土) 08:12:10.07 ID:yvgbUlYU.net]
IOモナドっつーか、モナドは難しく考えんで良いだろと。
IO String >>= String
IO String >> は結果を捨てる。>>= ¥_ -> の略記。
return String ってしたらIOなString返るから、return使えばモナドの途中で純粋な関数で加工出来る。


それがIOモナドにも具体的な型にも依存しない汎用的な表現が

m a >>= a

ってだけ。

これだけ覚えれば使うにゃ十分だし、使ってるうちにただの型クラスやってわかる。
結局型クラスも型を受け取れる型ってだけで、ただの型でもあるから、純粋関数の結果としてString返すと、IO StringとStringは型が違うよって怒られる。

だからIO Stringにする為にIO Stringな関数か、return使いましょうってだけ。

具体的な型を考えれば何のことはない。
returnはそう考えればまあ自然なんだが、リターンってよりレシーブって印象。

714 名前:デフォルトの名無しさん [2017/07/01(土) 09:35:49.67 ID:yvgbUlYU.net]
main = getLine >>= return.tail >>= putStrLn

getLine
一行入力でIO String生成。


>>=
getLineに生成されたIO StringをStringとして右辺に渡す。

return.tail
tailは受け取ったStringの先頭を省く。
そのままだとStringのままで、IO Stringを受け取る次の>>=に渡せないので、returnでStringをIO Stringにして返す。

>>=(2番目)
最終出力のputStrLnに向けてIO StringをStringにして渡す。

putStrLn
受け取ったStringを改行付き出力。

説明のために長く書いたけど、型を揃えれば良いって分かればこうも書ける。

main = getLine >>= putStrLn.tail

何もないところからIOを生成するmain = 直後の関数以降は基本的に純粋な型を受け取ってIOな型を返せばコンパイラ通るので、何の役にも立たないけどこれもコンパイル通る。

main = getLine >>= return.tail

putStrLnも関数である以上、何らかの値を返してるので見ようと思えば見れる。

main >>= putStrLn.tail >>= print

()にIOを付けたIO ()が返ってると分かる。

715 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 10:27:56.55 ID:8Dk+ywm5.net]
IOと純粋関数の関係がどうしても理解できなかったけどwiki読んだらやっとわかったからオススメ
https://wiki.haskell.org/IO_inside

716 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 20:20:17.13 ID:n7+jlCYi.net]
stack使ってるのですが、openFileでカレントディレクトリ以外のファイルを指定って出来ないんですかね?

717 名前:デフォルトの名無しさん [2017/07/03(月) 20:31:50.76 ID:UwBLUxpl.net]
stack関係あったっけ?
何となく¥を¥¥ってしてないだけじゃないかと予想。

718 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 21:56:26.43 ID:A29giBA8.net]
タプル作ろうと思ってHoogleで
f :: a -> b -> (a, b)
f a b = (a, b)
となるような関数探したら見つからないんだけどもしかしてない?
割と使いそうなイメージなんだけど

719 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:11:48.22 ID:TJZt+GMQ.net]
どういうときに使いたいのさ
curry/uncurry ならたまに使うけど



720 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:18:49.21 ID:ZOCy/rmL.net]
これで
https://wandbox.org/permlink/bSFTBbmr9cQGguSw

721 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:48:00.26 ID:Tq0FsZsH.net]
>>710
タプルコンストラクタ

$ ghci
GHCi, version 8.0.2: www.haskell.org/ghc/ :? for help
Prelude> :t ((,))
((,)) :: a -> b -> (a, b)

722 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:53:26.22 ID:AXnSyqoB.net]
>>713
おお、まさにこれです
ありがとうございます

723 名前:デフォルトの名無しさん [2017/07/10(月) 01:15:03.97 ID:IPU+pjhL.net]
すみません traceデバッグについてですが
ある変数に色とかで印を付けて
IOとは別の専用簡易コンソールに出力表示とか
簡単に出来ない物でしょうか。

724 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 19:13:14.12 ID:bXz+G42e.net]
GHC 8.2 で実装予定の backpack なるものが一体
現在のどのような問題をどのように解決することを目指したものか、
分かる方いますか?

どうも、モジュールシステムの拡張みたいですが...

725 名前:デフォルトの名無しさん [2017/07/17(月) 23:01:46.61 ID:4tJqH+Y+.net]
ご冥福

726 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 03:45:58.72 ID:6+yJKiYC.net]
すぐりって読むのだと思ってました

727 名前:デフォルトの名無しさん [2017/07/19(水) 22:41:31.74 ID:BqP8obNe.net]
https://twitter.com/tanakh/status/886624071005294592

これ?

728 名前:デフォルトの名無しさん mailto:sage [2017/07/21(金) 21:39:30.54 ID:kkMUVecO.net]
文字列のリストがあって、それぞれの要素を順番にputStrLnするだけならmapM_よりtraverse_の方がいいですか?

729 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 10:13:22.40 ID:/BTLbKbr.net]
Haskellerなんですぐ死んでしまうん



730 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 11:57:08.36 ID:/9K4Ed3n.net]
えぇ・・・

731 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 14:53:16.39 ID:4NLvcjES.net]
必要以上に多相にしたり制約を弱めるのは典型的な bad practice
concat のかわりに join 使ったりしないでしょ

732 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 14:54:33.27 ID:4NLvcjES.net]
ライブラリコード書くときには可能な限り型クラス制約を弱めて多相に
利用するコードではむしろ反対に

733 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 17:58:06.65 ID:1dVz8HPB.net]
>>723
つまりtraverse_の方がいいって認識でいいですか?

734 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 19:58:53.32 ID:AuEOuo+E.net]
Haskellerはマジでメンヘラが多い

735 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 22:29:16.45 ID:wIG0mEjF.net]
パフォーマンスモニターを提供する ekg というライブラリがあるんだが、
これ、なかなか凄いな。

統計情報がHTTPプロトコルでリアルタイムに提供されるから、
モニタリング専用のアプリを使わずとも普通のブラウザで見れる。
カウントするものをプログラムの中で定義することもできるみたいだし、
けっこう本格的だ。
パフォーマンスチューニングが捗りそう。


ちなみに、俺はこのライブラリの存在をここで知った。
www.stephendiehl.com/posts/production.html
このブログポストに商業アプリ制作にHaskellを使う際の心得みたいなことが書かれていて、
Performance and Monitoring の項で ekg が紹介されている。
このブログの他のポストもなかなか面白いから暇人は読んでみるといいよ。

736 名前:デフォルトの名無しさん mailto:sage [2017/07/23(日) 00:17:34.21 ID:m+ryfkmk.net]
>>725
ちょい待ち >>723>>724 のアドバイスに従うなら、そこは mapM_ でしょ

737 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 20:13:14.08 ID:Rqhmx9U8.net]
他の言語の書き方が良くなると聞いて始めてみたが、難しい・・・
というか今のとこ恩恵が分かんない^^;

738 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 20:20:07.13 ID:RBhDn3mI.net]
他言語の書き方は俺は良くなったな

739 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:03:53.98 ID:h3biSAhr.net]
過去何度か似たような質問や意見が出てるが、
今までこういう書き方だったのがHaskellのお陰でこう改善された、
という具体例が挙がった試しがない。
改善例が載っているブログなどの紹介すらない。

俺の中では、前後の違いを明確に説明できないものは改善とは認められない。
原因がはっきりしない事はあるだろうが、改善したと言うからには
少なくとも違いははっきりと説明してほしい。

それができないと言う事は、きっと違いが説明できないほど微妙で曖昧な変化を
改善と言っているのだろう。



740 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:22:17.61 ID:emVJufwa.net]
いやそんなの最初からちゃんとやれよと思うかもしれんが非関数型の言語を触っているときに比べて入出力をはっきりと意識するようにはなった
特に動的型付けだと何も考えなくても動くだけのものは作れてしまうからな

741 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:27:21.43 ID:jM5xaigZ.net]
大リーグ養成ギブスはめられてるような気持ち

742 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:56:08.66 ID:RBhDn3mI.net]
>>731
     /: : : : : __: :/: : ::/: : ://: : :/l::|: : :i: :l: : :ヽ: : :丶: : 丶ヾ    ___
     /;,, : : : //::/: : 7l,;:≠-::/: : / .l::|: : :l: :|;,,;!: : :!l: : :i: : : :|: : ::、  /     ヽ
    /ヽヽ: ://: :!:,X~::|: /;,,;,/: :/  リ!: ::/ノ  l`ヽl !: : |: : : :l: :l: リ / そ そ お \
   /: : ヽヾ/: : l/::l |/|||llllヾ,、  / |: :/ , -==、 l\:::|: : : :|i: | /   う う  前  |
.   /: : : //ヾ ; :|!: イ、||ll|||||::||    ノノ  イ|||||||ヾ、 |: ::|!: : イ: ::|/   な 思 が
   /: : ://: : :ヽソ::ヽl |{ i||ll"ン    ´   i| l|||l"l `|: /|: : /'!/l     ん う
 ∠: : : ~: : : : : : : :丶ゝ-―-      ,  ー=z_ソ   |/ ハメ;, :: ::|.   だ ん
   i|::ハ: : : : : : : : : : : 、ヘヘヘヘ     、  ヘヘヘヘヘ /: : : : : \,|.   ろ な
   |!l |: : : : : : : : :、: ::\    、-―-,      / : : :丶;,,;,:ミヽ   う  ら
     丶: :ハ、lヽ: :ヽ: : ::\__  `~ "      /: : ト; lヽ)   ゝ
       レ `| `、l`、>=ニ´        ,  _´ : :} `   /
         ,,、r"^~´"''''"t-`r、 _  -、 ´ヽノ \ノ   /    お ・
       ,;'~  _r-- 、__     ~f、_>'、_         |  で  前 ・
      f~  ,;"     ~"t___    ミ、 ^'t         |  は  ん ・
      ,"  ,~         ヾ~'-、__ ミ_ξ丶     |  な  中 ・
     ;'  ,イ ..          ヽ_   ヾ、0ヽ丶    l         /
     ( ;":: |: :: ..          .`,   ヾ 丶 !    \____/
     ;;;; :: 入:: :: ::      l`ー-、   )l   ヾ 丶
     "~、ソ:: :い:: :     \_  ノ ,    ヾ 丶

743 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 22:18:09.60 ID:Dtg+FNV7.net]
俺は大幅に改善されたので満足です

744 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 22:30:09.86 ID:DrMH5w+T.net]
はすける始めたら彼女とセフレが出来ました!

745 名前:デフォルトの名無しさん mailto:sage [2017/07/25(火) 00:51:32.66 ID:oURyYS1P.net]
デザインパターンのようなものが自然に学べる(要出典)

>>732
IOモナドを学んでしまうとvoidとかなんやねん!て気持ちになる

746 名前:デフォルトの名無しさん mailto:sage [2017/07/25(火) 02:18:19.45 ID:kRJD7bjt.net]
IO () ← なんやねん!

747 名前:デフォルトの名無しさん mailto:sage [2017/07/25(火) 11:48:16.84 ID:QpQhPQ2k.net]
空のタプルやね
引数にタプル使わないけど戻り値には使う
他の言語では最も書きにくいパターンを敢えて書く

748 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 03:54:31.04 ID:iGcNC8dh.net]
空のタポゥってvoidに相当するんでないのって訊いてんの!

749 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 07:51:05.82 ID:y/+6hAIl.net]
例えばIO ()なら空のタプル自体は要らなくとも「IOという文脈に包まれている」という情報は欲しい
遅延評価がデフォのHaskellで実行順序
を保証するためにはそれらのIOを繋げる必要がある
voidは何も返さないからそれができない
こんな感じで値そのものに意味はなくとも「それとセットになっている何か」が欲しいとき空のタプルを使うことが多い



750 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 08:18:47.17 ID:iGcNC8dh.net]
空タプルはvoidなんじゃないかっていってるの!
voidが無いなんて嘘っぱちだろっていってるの!

実質 IO void やろってゆってんの!

751 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 08:24:32.65 ID:UvZuKEGA.net]
物狂いか

752 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 11:08:02.42 ID:BU4hr0QJ.net]
IO () はIOモナドの中にしか現れられないが
他言語のvoidはその辺の関数に普通に紛れ込めてしまう
もちろん通常は規約とかデザインパターンなどで読みやすく気をつけるわけだけど
IOモナドならそういう意図しない副作用が無いことを
型レベルで保証してくれてありがたい

753 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 11:45:48.74 ID:tePeK+XY.net]
集合論でいうと()型の値の集合は空集合ではない
デザインパターンでいうとSingleton

だがvoidはSingletonではない
そもそもvoidはオブジェクトか?

754 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 13:52:35.44 ID:cb3Opfj1.net]
Haskellにおいてユニット型の値は () とボトムの2つ。

755 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 15:38:01.66 ID:tePeK+XY.net]
ボトムは正規形になっていない式ではないのか
途中の式のことを値といっていいのか

756 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 16:36:16.86 ID:cb3Opfj1.net]
>>747
https://wiki.haskell.org/Bottom

> Bottom is a member of any type, even the trivial type () or the equivalent simple type:
>
> data Unary = Unary

757 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 18:13:58.43 ID:tePeK+XY.net]
value of any typeとは言っていない

758 名前:デフォルトの名無しさん [2017/07/27(木) 18:57:57.46 ID:TN85Uszo.net]
>>747
関数を返す関数もShowのインスタンスじゃ無いから表示出来ないだけで値として扱われてるし、途中の式も値として扱われるなら扱って良いんじゃ無い?

759 名前:デフォルトの名無しさん [2017/07/27(木) 19:03:38.43 ID:TN85Uszo.net]
>>742
IO ()は出力関数の(どうせ捨てられる)値として便宜上付けてるだけだしなぁ。。。
別にIO Stringで毎回"Hello"とか返したっていいのをIO ()にしてるだけ。
受け取る意味はないけど、受け取って表示だって出来る。
そう言う意味じゃvoidとは言い難いな。



760 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 19:18:08.33 ID:20Yx27ly.net]
一体彼は何を躍起になってるんだろうか

761 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 20:05:00.63 ID:egT7olKo.net]
>>749
型を集合とみなしたときの元(member)をずっと型が取り得る値(value)だと思い込んでた。

違うのか。
それは済まなかった。

私のレスは無視してくれ。

762 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 22:06:59.31 ID:vZOWG5O9.net]
まあ確かに⊥を値と認めない流儀はあるからなあ

763 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 22:15:49.20 ID:vZOWG5O9.net]
任意の型aに対して、()型の値(≠⊥)を返す関数 :: a -> () はただひとつ

f _ = ()
つまり const ()

しかないので、「void型を返す関数」が(パラメータ多相を除いて)
一意に決まるということを受け入れるという自殺的蛮勇がないなら
void 型と ()型を同視することはできない

764 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 00:23:19.35 ID:4ZTKGS6D.net]
ゲーム作りてえなあ

765 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 01:03:41.38 ID:e8mE+qrd.net]
raincatは全ステージクリアした
スペランカー並みに弱い猫だなあれ

766 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 11:39:03.53 ID:kqaT8BL8.net]
遅延評価でグラフィック描画して何か嬉しいことあるん?

767 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 12:15:52.61 ID:SWzA4YZp.net]
deleteを遅延するガベコレだけで邪魔臭いんだが
毒食わば皿までとnewも遅延するみたいな感じ

768 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 20:11:41.20 ID:bMHI66Oo.net]
GHCランタイムシステムのガベコレって、人間が操作するなら必ずここで一瞬停まるから、この瞬間にちょっとだけガベコレしといてねっていう細かい調整はできないの?

とにかく食い尽くしてもうなくなったら、解放可能な記憶域ないか、ようやく探し始めるしか能がないの?

769 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 21:04:34.50 ID:Txodz0Ts.net]
>>760
標準ライブラリにGCを促す関数がある



770 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 21:13:59.96 ID:GuKX0EtE.net]
メモリー管理が陽に出てこないGC言語でGCについて語るAPIが存在するのも美しくないな
待機型処理の内部に組み入れられないんだろうか

771 名前:_ [2017/07/29(土) 21:43:41.58 ID:z3bKXBTm.net]
ghc 8.2.1リリース
age

772 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 22:00:35.21 ID:ezVHy3/u.net]
実行頻度不明なのに強制GCしたらGCのオーバーヘッドに食い尽くされる可能性あるやろ
人力か機械学習でGCポイント探すしかないわ
線形型はよ

773 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 22:05:39.73 ID:EGnuLLJd.net]
Numeric Prelude標準モードできねえかな

774 名前:デフォルトの名無しさん mailto:sage [2017/07/30(日) 18:38:08.27 ID:Qtbkg44k.net]
いつになったらGHCのコードに型を記述するんだよ
あんなコードじゃ常に参加してる奴しか解読出来ないだろ

775 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 14:19:58.09 ID:nRMWmSFr.net]
デバッグで行単位で進める、
変数の値を都度観察できる、みたいなエディタというかIDEってありますかね?

776 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 15:25:19.26 ID:D+JhlBxR.net]
デバッグで苦しんだことがないから分からないが
観察するべき実行時エラーが出るものなのか
必死に型を記述した結果がこれか

777 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 15:33:23.39 ID:W2G2gcC4.net]
>>767
ghciのデバッガじゃいかんの?

778 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 23:16:44.52 ID:Fofa317S.net]
>>768
>>769
いや、型は合ってんだけど画像いじってて行列の合計数が合わんとか、出来映えがおかしいとかそういうの。途中でどうなってるのか観察したい。
emacsのREPLでちまちま動かして確認してんだけど面倒いなって。

途中でブレークポイント設定とかGHCにあるっぽいのは見たけど、そちらをもう少し当たるのが正解ですかね。

779 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 00:12:26.54 ID:Ip+Lj8Tk.net]
純粋関数のprintデバッグができるDebug.Traceとかどうですか



780 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 07:59:11.85 ID:d2xIcHkQ.net]
プログラミング初心者だけど将来Haskell用のデバッガを作るのが夢です

781 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 08:47:54.62 ID:jTGWEJQg.net]
ジーニアス英和辞典 第五版にぴったりの例文があった
Passion without action ismerelya dream.

782 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 08:53:44.89 ID:z5sKoHNx.net]
デバッガよりVisual Studio並みの最強IDEがほしいわ

783 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 22:43:53.87 ID:PWpQLJ0B.net]
Bounded クラスと Enum クラスのインスタンスである型 T について、
n 個の要素を持つリスト型 [T] の値を全て要素として持つリストを生成する関数を enumerate とします。

たとえば型 T の値が A と B の2つだとし、n=3 だとすると、

(enumerate 3 :: [T]) = [[A, A, A], [A, A, B], [A, B, A], [A, B, B], [B, A, A], [B, A, B], [B, B, A], [B, B, B]]

となります。
ただし、生成されるリストの要素の順番は問いません。

私は下記のように定義しました。

enumerate :: (Bounded a, Enum a) => Int -> [[a]]
enumerate 1 = map (:[]) [minBound .. maxBound]
enumerate n = concatMap (\x -> map (x:) (enumerate (n-1))) [minBound .. maxBound]

n-1個の既に作られたリストの各要素 (リスト) に新たに型 T のそれぞれの値を接頭する作り方です。

シンプルで分かりやすいのですが、問題が1つあります。
この関数が生成したリストの全要素を順に別の計算に消費するようなプログラムを作っているのですが、
上記の定義ですと、リストの全要素が消費し尽くされるまでほぼ全要素分のメモリが必要になります。
x : x : x : ... と積み上がった cons がメモリに残るような作りのためです。

消費は順に一つずつ行うので、理想的にはメモリも要素一つ分で足ります。
現実はそうもいかないと思いますが、全要素分のメモリを保持し続ける必要はないはずです。

メモリ消費量をもっと抑える良い方法はないでしょうか。

784 名前:デフォルトの名無しさん mailto:sage [2017/08/04(金) 03:26:35.06 ID:F7/4gW8S.net]
>>775
ちゃんとプロファイル取ってないから確証はないけど
enumerateの定義が悪くてメモリ食いすぎてるような気がする
Control.Monad のreplicateMをリストモナドに対して使うと
同様に重複順列を作れるからそれならどうだろうか
replicateM 3 [0, 1] -- > [[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
あとリストを順に消費していくような計算ならfoldl'が使えるはず

あるいは、「EnumなT型の有限個の直積」をうまく新たにEnumのインスタンスにして、
succ: Enum a => a -> a
で例えば succ [A, A, A] = [A, A, B]
みたいに計算できるようにしておいて、
STRefを利用してsuccで更新しながら消費していく、とか

785 名前:デフォルトの名無しさん mailto:sage [2017/08/04(金) 06:02:27.89 ID:dl0ZTbjy.net]
https://wandbox.org/permlink/jdlx4FhKT80IWQKN

data T = A | B deriving Show

hoge 0 = A
hoge 1 = B

fuga _ 0 _ = []
fuga k x n = let (d,m) = divMod n k in hoge m : fuga k (x-1) d

piyo x = map (fuga 2 x) [0..2^x-1]

main = print $ piyo 3

786 名前:デフォルトの名無しさん mailto:sage [2017/08/04(金) 07:58:50.98 ID:QkUZB/64.net]
>>775
import Data.List
enumerate 1 = map (:[]) [1..]
enumerate n = concatMap (\x -> map (x:) (enumerate (n-1))) [1..]
main = print $ foldl' (+) 0 $ map (foldl' (+) 0) $ enumerate 10000
これ(最適化無し)でメモリリークしないあたり
普通に深さ優先で要らなくなった枝はGCされてると思うけど

787 名前:デフォルトの名無しさん [2017/08/04(金) 08:14:23.88 ID:QkUZB/64.net]
あー>>778だと最後の一個が変わり続けるだけだから例としてはダメか
一応enumerateの引数やEnumリストの長さを変えてみても大丈夫だったけど

788 名前:デフォルトの名無しさん [2017/08/04(金) 22:00:01.39 ID:dl0ZTbjy.net]
そんなことより8月4日21時から72時間のICFPのプログラミングコンテストがあるよ!
HaskellerならICFPくらい知ってるよね!

events.inf.ed.ac.uk/icfpcontest2017/
https://twitter.com/ICFPContest2017

789 名前:デフォルトの名無しさん mailto:sage [2017/08/04(金) 22:13:55.04 ID:hukhoKmj.net]
みなさん、ありがとうございます。

>>776
前半の replicateM を使う方法は、プロファイリングしてみましたが、私のものとほとんど同じ結果でした。
メモリ消費の傾向もピークも同じ形です。

enumerate 14 で試したところ、最初にピークの 100MB ほどまでぐんぐんメモリを消費し、
その後 90MB 近くまで落ちてから一定です。

後半の方法はこれから試してみます。


>>777
挙げていただいたコードを Bounded と Enum を使って一般化して試してみました。
同様に enumerate 14 で実行してみると、メモリ消費傾向は全体的にほぼまっすぐな長方形に近い台形で、
ピークも 40kB と桁違いに少ないです。


>>778
メモリリークが起きていないことはどのようにして確認されました?
私は実行する時に RTS オプションの hc を付けてプロファイルを取って確認しました。
確かに深さ優先で一度ずつ探索する処理なのに、メモリが 100MB も消費されていて、
これは明らかにメモリリークしていると思ったのですが、どうでしょう?


これから、私や >>776 の前半のやり方と >>777 のやり方の違いについて研究してみます。



790 名前:デフォルトの名無しさん [2017/08/05(土) 02:29:47.95 ID:B0WoWMTx.net]
>>775
これの話に似てる?
kanae.2ch.net/test/read.cgi/prog/1431362559/667-670n

これみたいなメモ化を使えばいいような気もする
echo.2ch.net/test/read.cgi/tech/1428597032/873
https://wiki.haskell.org/The_Fibonacci_sequence

791 名前:デフォルトの名無しさん mailto:sage [2017/08/05(土) 03:50:29.84 ID:pRMdXxul.net]
>>781
40KBはありえないので一般化に失敗してると思われる

792 名前:デフォルトの名無しさん mailto:sage [2017/08/05(土) 04:37:17.71 ID:2UARNcsu.net]
>>782
メモ化は空間計算量と引き換えに高速化する話だからむしろ逆のような
フィボナッチで言うならInteger 3個分のメモリがあればn番目が計算できるでしょって話だから
タプリングの方が解決策としては近いと思う

結局リストで定義しちゃうと(そして評価しちゃうと)
そのイミュータブル性のために各要素はまた参照されるかもしれないから
GHCは捨てられないんだと思ってる

793 名前:デフォルトの名無しさん mailto:sage [2017/08/05(土) 05:35:09.29 ID:pRMdXxul.net]
/usr/bin/time -f "sec: %e\tmem: %M"

n=13

>>775の sec: 0.36 mem: 89032
https://paiza.io/projects/EvT2VA9nWlsu95GfM7llhA

>>776の replicateM は sec: 0.38 mem: 89016 と確かにメモリそう変わらない
https://paiza.io/projects/-jBpd8K5u3IcfeqromaImg

>>777の変な奴は sec: 0.86 mem: 3856 と確かにメモリ少ないけど時間かかりすぎ
https://paiza.io/projects/k_jsvUVfq54JyTaA691CaQ

>>782の iterate は sec: 0.36 mem: 77668 と少しメモリ小さい
https://paiza.io/projects/rb9bWzNuI410te_SxtMqMw

794 名前:デフォルトの名無しさん mailto:sage [2017/08/05(土) 11:12:37.24 ID:xs6w3tHN.net]
iterateは良いよね
iterateはメモリを無限に使うとか予想したやつを退場させてから冷静な議論ができる

795 名前:デフォルトの名無しさん mailto:sage [2017/08/05(土) 11:39:14.63 ID:ZbIs+TkB.net]
好戦的

796 名前:デフォルトの名無しさん mailto:sage [2017/08/05(土) 13:37:30.60 ID:xs6w3tHN.net]
人間を退場させそうな勢いのAIに同じことが言えるのかね
好戦的AIの開発を禁止できるのか

797 名前:デフォルトの名無しさん mailto:sage [2017/08/05(土) 20:09:57.57 ID:O1n7JOVS.net]
Windowsでjupyterできませんか?

798 名前:デフォルトの名無しさん mailto:sage [2017/08/06(日) 00:35:09.20 ID:Q0UOjaQj.net]
>>785
haskell初心者の私が頑張ってみました

sec: 0.18 mem: 4024
https://paiza.io/projects/WzVPNUUH0xYOfCR99rLSVw

799 名前:デフォルトの名無しさん mailto:sage [2017/08/06(日) 14:15:08.49 ID:PBiILbDw.net]
私 (>>775) のや replicateM を使う方法は仮想的なツリーを深さ優先でたどります。
なので列挙したい型や、リストの要素数の影響をもろに受けるのですね。
(リストの要素ではなく、それを計算するためのサンクが大きい?)

一方で >>777 は10進数の値を一つずつn桁のk進数に変換しており、
また >>790 はn桁のk進数の値を0から順に1ずつ足しています (>>776 の後半のアイデア)。
共に理論上は1要素分のメモリしか必要ない方法なので、かなり省メモリなんですね。

理屈が分かってスッキリ



800 名前:オました。
みなさん、ありがとうございました。
[]
[ここ壊れてます]

801 名前:デフォルトの名無しさん mailto:sage [2017/08/07(月) 02:20:55.75 ID:LndoSP5N.net]
未評価のサンクじゃなくて最終的にn-1以下の評価済み結果を全て保持することになるからメモリを食うのでは?

802 名前:デフォルトの名無しさん mailto:sage [2017/08/07(月) 09:52:01.96 ID:/JDQv1Xc.net]
自由な長さのビットは標準ライブラリに無いのですか?

803 名前:デフォルトの名無しさん mailto:sage [2017/08/07(月) 11:32:36.95 ID:EbDwvOe5.net]
>>792
全てとは何個ですか
有限個なら定量的に書いてください
無限なら書かなくていいです

804 名前:デフォルトの名無しさん mailto:sage [2017/08/07(月) 20:00:07.36 ID:Nk2fFjGd.net]
>>789
dockerでihaskellだったら使ってる

805 名前:デフォルトの名無しさん mailto:sage [2017/08/07(月) 21:16:35.72 ID:AGrOxn5I.net]
>>792
そうでしょうか?

私の方法 (>>775) で data T = A|B|C の時に print $ enumerate 3 としてみると
[[A,A,A], [A,A,B], [A,A,C], [A,B,A], [A,B,B], ...] の順で評価されます。

外側リストの第1要素 [A,A,A] を評価し終えて次に第2要素 [A,A,B] を評価しようとする時、
[A,A,A] の第3要素の A はもう要らないので捨てて構わないはずです。
[A,A,B] の評価にまだ必要なのは第1要素と第2要素それぞれの A のみのはず。
さらに [B,A,A] まで評価が進めば、[A,A,A] から [A,C,C] まで評価した分はもう必要ありません。

そう考えると、enumerate n に常に必要なのは理論的には T 型の値 n 個分のみ。
評価済みの値の保持に必要なメモリ量は >>777>>790 の方法と同じです。

なので、評価済み結果の保持によってメモリが大きく消費されるのであれば、
>>777>>790 でも同様に大きなメモリを消費しているはずだと私は思うのですが、
どうでしょうか?

806 名前:デフォルトの名無しさん mailto:sage [2017/08/07(月) 21:17:23.45 ID:AGrOxn5I.net]
>>792
私が原因はサンクにあるのではと思ったのは次のことからです。

私の方法 (>>775) で enumerate 3 :: [[T]] の第1要素を評価しようとする時、
まず concatMap の引数である [minBound .. maxBound] の第1要素だけが評価され、
残りは未評価のまま残ります (正確には enumFromTo の結果の弱頭部正規化ですね)。
次に map (x:) enumerate (n-1) があるので enumerate 2 の第1要素を評価する必要があります。
enumerate 2 でも同様のことが起こります。
これ、全部評価されつくされるまで、深さ分だけずっと残りますよね。

enumerate 自身が深さ方向にたどるごとに毎回呼ばれ、評価し切る前にまた呼ばれるので、
未評価で残るのは [minBound .. maxBound] の部分だけではないと思います。

このようなことが積み重なって、大量のメモリ消費に繋がっていると私は考えました。
リストを消費して何かを計算する関数に使うリストそのものを再帰的に作ると、
たぶん似たような事(無駄なメモリ消費)が起こるのではないかと思います。

807 名前:デフォルトの名無しさん mailto:sage [2017/08/08(火) 00:32:40.42 ID:ix2x2634.net]
sumじゃなくlenghtで計算すると>>790のでもメモリ使うんだね

>>775のsec: 0.19 mem: 89068
https://paiza.io/projects/CqJoDIkGAnH7qGSCKEAiyQ

>>790のsec: 0.09 mem: 49084
https://paiza.io/projects/L4gRQ7RM5z3XFGf_Wu1YvQ

808 名前:デフォルトの名無しさん mailto:sage [2017/08/08(火) 03:20:35.89 ID:fUnlTWTU.net]
副作用の無い関数は同じ引数で毎回同じ戻り値になることが保証されてます

n=2のとき
enumerate 2 = concatMap (\x -> map (x:) (enumerate 1)) [A,B,C]
となります
[A,A]..[A,C]まで評価が終わったとき enumerate 1 = [[A],[B],[C]] が評価済みとなり再利用が可能となり
enumerate 2 = [A,A] : [A,B] : [A,C] : concatMap (\x -> map (x:) [[A],[B],[C]]) [B,C]
となり n-1 すなわち n=1 のときの結果が保持されることが分かります

同様にn=3のとき同じことが生じ
enumerate 3 = [A,A,A] : ... : [A,C,C] : concatMap (\x -> map (x:) [[A,A], ... ,[C,C]]) [B,C]
のようになり n-1 すなわち n=2 のときの結果が保持されることが分かります

また n=3 のとき n=1 の結果の [[A],[B],[C]] の各要素は n=2 の結果から参照されてます
すなわちGC可能な対象は 中身の[A] [B] [C]ではなく[,,,]の外側の部分だけです
(もちろんまだ enumerate 1 をどこか呼び出される可能性があるならGCはされませんが…)

ここまで言えば>>792の意味がわかりますね?

はい

809 名前:デフォルトの名無しさん mailto:sage [2017/08/08(火) 03:28:04.28 ID:fUnlTWTU.net]
なおサンクを気にされてたようですが
サンクを気おつけるべきは>>790のようなコードだと私は考えますが
lastを取れば分かります
https://paiza.io/projects/lmYXW-sssdTlAIGrju4u9g



810 名前:デフォルトの名無しさん mailto:sage [2017/08/08(火) 03:45:42.60 ID:aoRcppZr.net]
>>796
>外側リストの第1要素 [A,A,A] を評価し終えて次に第2要素 [A,A,B] を評価しようとする時、
>[A,A,A] の第3要素の A はもう要らない

後ろ二つ [A,A]は、[A,A,A],[B,A,A],[C,A,A]で共有されるから
そこで捨てるわけにはいかないんじゃないかな

811 名前:デフォルトの名無しさん mailto:sage [2017/08/08(火) 04:31:27.11 ID:shTh0A51.net]
詳しい情報サンクス

812 名前:デフォルトの名無しさん mailto:sage [2017/08/08(火) 21:31:40.60 ID:OEct+pCd.net]
>>799
すいません、まだ良く理解できていません。
2点確認させてください。


まず、1行目でおっしゃっているのは参照透過性のことですよね。


次に、3行目以降でおっしゃっていることですが、それは本当ですか?
それだと勝手にメモ化が行われているように私には見えるのですが。

例えば f x = x*2 という関数が定義されているとします。
その時に、別の関数 g の定義の中で、

let a = f 1; b = f 1 in ...

とやっても、1度目の g の呼び出しで 1*2 の計算結果は再利用されませんよね。
a の束縛時と b の束縛時で、計 2 回同じ計算がされると思います。

1度目の g の呼び出しで a や b が 2 と評価された後、再び g が呼ばれた時は、
a や b はもう関数 f ではなく値 2 を指していますから、
これを以て「保存される」「再利用される」と言うのは理解できます。

以上のことから、enumerate 1 = [[A], [B], [C]] のリストも、
このままでは再利用されないと思うのですが。
再利用するには、計算結果を変数に束縛する必要がありませんか。


変なことを言っていたらすいません。

813 名前:デフォルトの名無しさん mailto:sage [2017/08/08(火) 21:58:17.33 ID:aoRcppZr.net]
>>803
>再利用するには、計算結果を変数に束縛する必要がありませんか。

mapの引数として束縛されるんじゃないの? >>775

814 名前:デフォルトの名無しさん mailto:sage [2017/08/08(火) 22:23:03.19 ID:OEct+pCd.net]
>>804
仮引数が束縛しているのはそのスコープ内だけだと思っていましたが、
違うのでしょうか。

let a = map id (enumerate 1); b = map id (enumerate 1)

これは2度同じ計算 (enumerate 1 の評価) がされませんか?

815 名前:デフォルトの名無しさん mailto:sage [2017/08/08(火) 22:33:15.60 ID:aoRcppZr.net]
実際に起こっているのはこういうことなんだろうな

let a = map id (enumerate 1); b = a; c=a

816 名前:デフォルトの名無しさん [2017/08/09(水) 00:17:08.56 ID:VTzajaTq.net]
>>799-800
嘘乙

817 名前:デフォルトの名無しさん [2017/08/09(水) 02:22:31.31 ID:mQsXelmt.net]
Glasgow Haskell Compiler上の遅延オブジェクト再利用手法の設計と実装
https://www.jstage.jst.go.jp/article/jssst/32/1/32_1_253/_pdf

818 名前:デフォルトの名無しさん mailto:sage [2017/08/09(水) 05:51:36.85 ID:L1lV7cdZ.net]
・愚直にパラメーターマシマシの関数
・そのごちゃごちゃしたパラメーターをデータ構造にまとめてコードの視認性と一目理解可能性を向上したコード

後者が前者より2倍近く時間かかって悲しい
データ構造の更新に思いの外時間がかかってるのだろうか

データ構造の一部だけ更新って、変える部分だけ新しく作って、後のパラメーターは元のデータのそれへポインタコピーするだけだと思うんですけど
それでもオーバーヘッド嵩むもんなんすかね


ごちゃごちゃ版の、一つパラメーター更新して再帰で関数呼び出すだけなのと、
データ構造にまとめた版の(データ構造の)一つパラメーター更新して再帰で関数呼び出すのとは
何が処理の手間的に違うんですかね


いいからパラメーター全部そのまま関数に並べ立てた方が速いんだよって言われてるようで悲しい

性能を犠牲にせずにメンテ力アップしたい

819 名前:デフォルトの名無しさん mailto:sage [2017/08/09(水) 05:57:53.35 ID:L1lV7cdZ.net]
多くの場合を受け取って、後でcaseなどで引数の場合分けをするより
トップレベルで最初に引数のパターンマッチで場合分けしてから始める書き方の方が速いんですかね

後者はなんか何度も関数名書かなきゃいけなくて汚い感じするんですが。同じlet式もボイラープレートのようにまた書かなきゃならないし

でも後者の方が高速動作する(経験則)みたいで悔しい



820 名前:デフォルトの名無しさん mailto:sage [2017/08/09(水) 07:31:58.59 ID:azQJOuJj.net]
vectorパッケージ使ってて、ベンチマークとるとVector.Fusion.UtilとVector.Fusion.Stream.Monadicにリソースが割かれてるんだけど、
stream fusionてコンパイル時に効いてて、ランタイム時には出てこないと思ってたのだが、違うんかね?

821 名前:デフォルトの名無しさん [2017/08/10(木) 00:20:12.66 ID:joXozDrb.net]
本物のプログラマはHaskellを使う - 第31回
itpro.nikkeibp.co.jp/article/COLUMN/20090512/329783/
> これは,GHCの最適化機能の一つである「共通部分式の削除(CSE:Common Subexpression Elimination)」によって,共通する式「unsafeVal 10」がメモ化されたためです。これにより「unsafeVal 10」は1回しか評価・実行されなくなってしまいます。

822 名前:デフォルトの名無しさん [2017/08/10(木) 00:21:53.72 ID:joXozDrb.net]
> Haskellには第8回で説明した「メモ化」という機能があるため,同じ式が複数回,評価・実行されることはありません。

823 名前:デフォルトの名無しさん mailto:sage [2017/08/10(木) 01:41:50.38 ID:wtM226NM.net]
>>809
パラメータごちゃごちゃってのが多引数関数なら、Haskellの関数はカリー化されてるので
変更するパラメータの箇所によっては関数定義が使いまわせて効率がよくなってる、かも

末尾再帰化で局所関数作ってやるみたいに、
外からは定義したデータ構造で受け取って、
関数内で再帰回すときはばらした局所関数を使うとかはどうか

824 名前:デフォルトの名無しさん mailto:sage [2017/08/10(木) 06:48:00.63 ID:Gy6ZNt2K.net]
メモ化じゃなくてグラフ簡約では?

825 名前:デフォルトの名無しさん mailto:sage [2017/08/10(木) 07:14:52.40 ID:7mVrofJh.net]
itpro.nikkeibp.co.jp/article/COLUMN/20070305/263828/
>本物のプログラマはHaskellを使う
>第8回 遅延評価の仕組み
>この問題を解決するのが必要呼び出しです。必要呼び出しでは,
>同じ変数から束縛された項はポインタによって共有され,
>一度簡約された項をもう一度使用する場合には最初の計算によってキャッシュされた解を利用します。
>項を共有することにより,構文はもはや通常の木構造ではなくグラフ(graph)構造を取ることになります。
>そのため,このような簡約方法を「グラフ簡約(あるいはグラフ簡約法,graph reduction)」と呼びます。
>また,同じ式の評価のために,キャッシュされた解を使う手法のことを「メモ化(memoization)」といいます。

826 名前:デフォルトの名無しさん mailto:sage [2017/08/10(木) 11:53:35.98 ID:Mbfm9qrf.net]
共通部分式削除か
もしバグの原因が最適化だったら簡単だな
最適化を無効にするだけでわかる

827 名前:デフォルトの名無しさん mailto:sage [2017/08/10(木) 15:16:55.85 ID:7Zrve9l8.net]
共通部分式削除ではないしバグでもない

828 名前:デフォルトの名無しさん mailto:sage [2017/08/10(木) 16:49:36.71 ID:R2w5AQk8.net]
ぼく、グラフ簡約がいつされていつされないのかよく解ってない(`・ェ・´)

829 名前:デフォルトの名無しさん [2017/08/10(木) 22:16:48.24 ID:fh9/jf6h.net]
基本的なこと
www.kotha.net/hperf/basics.html
> 関数の自動メモ化はない
> Haskellの関数は同じ引数で呼ぶと同じ結果を返すので透過的にメモ化が可能だが、GHCはそれを行わない。
> 局所的な最適化によってメモ化と同じ結果になることはあるが、一般には期待できない。
> メモ化が必要なら「引数->結果」の対応を保存するデータ構造(Map、Arrayなど)を明示的に用意する必要がある。



830 名前:デフォルトの名無しさん [2017/08/10(木) 22:27:51.24 ID:fh9/jf6h.net]
GHCのこと
www.kotha.net/hperf/ghc.html
> プログラムの低水準の振る舞い(たとえば、「このループでメモリ確保は発生する?」「この式はどのタイミングで評価される?」)を理解したり、GHCの最適化の結果を見たりするのには、Core言語形式の中間出力を読むと良い。
> 特に、小さいループを可能な限り高速化したい場合など、最適化後のCore出力を比較しながらコードをいじるのが有効なことがある。
> Core形式の最終形(最適化された後、STG言語に変換される直前)は-ddump-prepで読める。

831 名前:デフォルトの名無しさん mailto:sage [2017/08/10(木) 23:42:17.05 ID:7Zrve9l8.net]
>>820
www.kotha.net/hperf/basics.html
Haskellの言語仕様(ja)は式の評価順序を定めていないが、
GHCを始めとする有名な処理系は全て「必要呼び(call by need)」という評価戦略を基本にしている。

必要呼び戦略のもう一つの特徴は引数の自動メモ化である。
ある関数の仮引数が、その関数の本体に複数回出現したとしても、対応する実引数の評価は高々一回しか発生しない。

832 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 00:45:37.86 ID:Ze2QVHug.net]
困ったときはhaskell-masterことtanakhに助けを求める

833 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 03:54:12.02 ID:7orZPIZ6.net]
フィボナッチ数を漸化式で単に実装したとき、そのままだと深い部分で同じ引数による呼び出しが無数に発生してると思うんですが
自動メモ化してくれないんすね

834 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 04:15:27.98 ID:L7AEIGon.net]
>>824
それは>>820のほうで >>775で起こる「メモ化」は>>816だろ

835 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 05:49:13.91 ID:ZqUin61F.net]
言語別平均年収ランキング

1位Scala 626万円
2位Python 601万円
3位Kotlin 577万円
4位Swift, Ruby 562万円
6位Java 552万円
7位Perl 551万円
8位 C言語 538万円
9位JavaScript 536万円
10位PHP 522万円
11位COBOL 509万円

以下は求人が少ないためランキングから除外
Groovy 680万円
Haskell 670万円
Erlang 604万円
LISP 581万円

尚、C++, C#は調査対象外とする

836 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 10:48:20.88 ID:Ca8C76qb.net]
>>826
>尚、C++, C#は調査対象外とする
なぜなんだ?それこそ興味深いんだが?

837 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 10:55:08.08 ID:mLIKyCPo.net]
難しすぎて習得者が少なすぎて調査不能なんだろう

838 名前:デフォルトの名無しさん [2017/08/11(金) 11:06:36.65 ID:QQDjRimB.net]
求人数が少ないから除外?
どうしてもその言語じゃなきゃだけど、その言語使える人が少ないって方が給料良いんだが。
(あと金出す側の資金力にもよる)

Fortranとか意外と良いぞ。
金融系なら関数型言語。

839 名前:デフォルトの名無しさん [2017/08/11(金) 11:07:39.31 ID:QQDjRimB.net]
あ、Fortranは大学がスパコンで使うとかの場合ね。



840 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 11:15:12.10 ID:07jWFZnC.net]
いやC++C#は

841 名前:スいだろうよ []
[ここ壊れてます]

842 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 11:32:50.22 ID:eQbA+Atw.net]
なぜ 828 がジョークだと分からないんだw

831 も 829 にマジレスするなら、828 がジョークだと教えないと
(まさか 831 は 828 に対してのレスってことはないよね?)

843 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 14:56:02.48 ID:0Mux6fCC.net]
>>826の元記事はこれ
プログラミング言語別の平均年収ランキング、1位は「Scala」 - ITmedia NEWS
www.itmedia.co.jp/news/articles/1708/10/news073.html

844 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 20:01:49.81 ID:rgIYrPBr.net]
グラフ簡約で物理同値が保証されてることを「メモ化」とはいわなくない?

845 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 20:33:13.01 ID:o2mcpSct.net]
>>834

>>816
>そのため,このような簡約方法を「グラフ簡約(あるいはグラフ簡約法,graph reduction)」と呼びます。
>また,同じ式の評価のために,キャッシュされた解を使う手法のことを「メモ化(memoization)」といいます。

846 名前:デフォルトの名無しさん mailto:sage [2017/08/11(金) 21:13:47.87 ID:eQbA+Atw.net]
メモ化って memorization の訳だと思ってたが、 memoization という造語(1968年初出)の訳だったのか

んで、メモ化は簡約結果が同値であることを利用して、
計算結果を使いまわす研究での用語だったみたいね

ttps://ja.wikipedia.org/wiki/メモ化

847 名前:デフォルトの名無しさん [2017/08/12(土) 00:24:09.94 ID:yWjB6ujN.net]
Haskell でのデバッグ - あどけない話
d.hatena.ne.jp/kazu-yamamoto/20120606/1338957783

848 名前:デフォルトの名無しさん [2017/08/12(土) 19:28:27.04 ID:G1Oa8HnK.net]
i.imgur.com/Aso3WgV.png

メモ化ってどうやるの?

849 名前:デフォルトの名無しさん mailto:sage [2017/08/12(土) 21:06:06.85 ID:vdGf/ex1.net]
参照透明性を利用する
一度評価したらもう動かないのだという性質を利用するのだ
コンテナと組み合わせてほら!



850 名前:デフォルトの名無しさん mailto:sage [2017/08/12(土) 22:47:13.92 ID:zuB4Y/rr.net]
>>838
trace関数のソースにこう書かれてた

The 'trace' function should /only/ be used for debugging, or for monitoring
execution. The function is not referentially transparent: its type indicates
that it is a pure function but it has the side effect of outputting the
trace message.

他の関数と同様に考えるわけにはいかないようだ

851 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 00:48:15.11 ID:SYaWjJhn.net]
Python, Kotlin, underscore.js にも、memoize がある

ナップサック問題で、使う

852 名前:デフォルトの名無しさん [2017/08/13(日) 01:44:46.49 ID:Pg7jRQiA.net]
Let vs. Where - HaskellWiki
https://wiki.haskell.org/Let_vs._Where#Lambda_Lifting

これってwhereは引数に変換されるってこと?(英語うまく訳せなくて分からない)

853 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 06:26:42.63 ID:BxbLY5/X.net]
競技プログラミングではデフォルトライブラリしか使えないので
高度なアルゴリズムは自分で勉強して実装しておいたものをコピペするしかないのだ

854 名前:デフォルトの名無しさん [2017/08/13(日) 10:34:38.57 ID:fRo9GRp1.net]
モナドってなんなの?

855 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 12:11:08.44 ID:ndxDWak1.net]
文脈

856 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 13:12:26.05 ID:mWeUlEpW.net]
山本タソは「裏面配線」って言ってたかな

857 名前:デフォルトの名無しさん [2017/08/13(日) 17:47:54.48 ID:fRo9GRp1.net]
関数プログラミングって文字列型って上手くあつかえるの?
オブジェクト指向の最大の欠点って「文字列を上手く扱えない」ところに
あると思うんだよね。

858 名前:デフォルトの名無しさん [2017/08/13(日) 17:51:31.77 ID:fRo9GRp1.net]
>>846
何か「表面」があっての裏面配線なんだろ?
ではその表面って何?

859 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 19:22:11.54 ID:zbgzOget.net]
>>842
違うよ。

ある関数の定義に使う補助的な関数の定義は、独立してトップレベルに置く事もできるし、
let や where を使って関数定義の中に置く事もできるよ、って言ってる。

関数内部で定義されていた関数を外に出して独立させることを lambda lifting と言って、
逆に外にあった関数を別の関数の内部で定義することを lambda dropping と言うんだ。

Haskell を使うだけならこんな理解で十分なんだけど、
もともとは関数型言語の処理系の研究で出てきた用語なんで、
その辺りまで深く学びたいのなら、やつぱり英語を読めないと難しいかも。


ちなみに、そのリンク先の [3 Lambda Lifting] と比べれば、
その直後の [4 Problems with where] の方が衝撃的な内容だね。
Haskell を実用的に使っている人にとってはこっちの方が大事な内容だよ。



860 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 20:15:07.01 ID:DrQ+cSjE.net]
Haskellという土台の上に、オレオレ言語を構築する。それがモナドだ

Haskell上で動作する『ぼくのかんがえたさいきょうのげんご』

DSLプラットフォーム

861 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 20:19:51.10 ID:qvBBF+tW.net]
>>849
衝撃だけど実際どれくらいパフォーマンス上のインパクトがあるの?

862 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 21:59:10.19 ID:zbgzOget.net]
>>851
試せばすぐに分かるが、あのフィボナッチ数のサンプルでは全く大した事なかったりする。
確かに後者の方が遅い代わりにメモリ効率いいけど、ほとんど差が出ない事に驚くほどだよ。

差がはっきり出る例を作る方が難しいと思う。


衝撃なのはパフォーマンスの差じゃなくて、単に引数を省略しただけで
コンパイルの結果に差が出ることがある、という事実。

GHCにはこういうことがあると、頭の片隅にでも入れておいた方がいいね。
他にも「単に***を変えただけで何で意図したように動かないの?」
ってなるようなコンパイラの仕様があるだろうから、
それに出くわした時に、もしかしてと気づければ無駄に悩む時間が省ける。

863 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 22:05:27.98 ID:IBmKuvX6.net]
STモナドとSTArrayの理解を深めるのに向いてる書籍やサイトなどがあれば英語でもいいので教えていただきたいです
競技プログラミングで少し行き詰まってて

864 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 22:12:47.72 ID:qvBBF+tW.net]
>>852
なるほど
関数プログラミング入門か実践入門あたりの和書でもポイントフリーか否かで
動作が変わるという内容を見たことはある

865 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 22:35:47.24 ID:3dVRXwBQ.net]
>>851
fib1 40は1秒かからなかったけど
fib2 40だと37秒かかった

fib1 = (map fib1' [0 ..] !!)
where
fib1' 0 = 0
fib1' 1 = 1
fib1' n = fib1 (n - 1) + fib1 (n - 2)

fib2 x = map fib2' [0 ..] !! x
where
fib2' 0 = 0
fib2' 1 = 1
fib2' n = fib2 (n - 1) + fib2 (n - 2)

866 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 22:42:29.03 ID:3dVRXwBQ.net]
>>855
fib1 43は1秒かからなかったけど
fib2 43は2分40秒かかった

867 名前:デフォルトの名無しさん [2017/08/13(日) 22:56:30.39 ID:Pg7jRQiA.net]
>>849
教えてくれてありがとう

868 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 23:03:01.35 ID:Kt+T0SXe.net]
毎回 let 束縛し直すから遅い、って凄えなこれ
手動 eta-reduction 必須、みたいなんか

869 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 23:18:59.79 ID:AxVfgjdD.net]
>>855
fib3 40、fib4 40は fib2 40と同じくらい

fib3 =
let fib3' 0 = 0
fib3' 1 = 1
fib3' n = fib3 (n - 1) + fib3 (n - 2)
in (map fib3' [0 ..] !!)

fib4 x =
let fib4' 0 = 0
fib4' 1 = 1
fib4' n = fib4 (n - 1) + fib4 (n - 2)
in map fib4' [0 ..] !! x



870 名前:デフォルトの名無しさん mailto:sage [2017/08/13(日) 23:39:51.65 ID:DrQ+cSjE.net]
>>842
なにこれこわい

871 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 00:09:46.90 ID:CgEdc2Wx.net]
>>855
最適化オプションを付けてコンパイルしてみ。
ほとんど差が無くなるから。

872 名前:デフォルトの名無しさん [2017/08/14(月) 00:40:48.93 ID:qlMtZwAF.net]
>>840
traceはメモ化には使えないってことですか

>>851-852
試してみた
使用メモリがだいぶ違う、低スペックPCなので20でも実行時間に差が出た
i.imgur.com/lJUUCAs.png
i.imgur.com/zXHSwNH.png

873 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 01:18:11.31 ID:BK9BhUbr.net]
モナドを取り入れると明らかに型が違うのが分かる
Identityモナドでもいいんだが
問題なのは引数の省略ではなくコンストラクタの省略ではないか

fib1 = return (map fib [0 ..] !!)
fib2 x = return (map fib [0 ..] !! x)

874 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 01:40:22.76 ID:tyQzDLaM.net]
呼び出し毎の関数束縛が遅いってことかね
値の束縛やトップレベルの関数呼び出しだとどの程度だろう

875 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 03:27:39.46 ID:YjoaiCYq.net]
>>861
たしかに最適化で差異がなくなった


最適化なし -O0
fib1 (sec: 0.00 mem: 3456) https://paiza.io/projects/0LYONUr9fsU2GCX0AE8A_g
fib2 (sec: 0.87 mem: 4608) https://paiza.io/projects/iNAIEVZM5IY5uLxzJ_QJ7w


最適化あり -O1
fib1 (sec: 0.00 mem: 3280) https://paiza.io/projects/XCnm40B0C1HcbuAIBGyUFw
fib2 (sec: 0.00 mem: 3312) https://paiza.io/projects/Et1N4r-vdxXjrid_7hn6PA


計測手段 /usr/bin/time -f "sec: %e\tmem: %M"

876 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 05:10:48.34 ID:8PjQyPOp.net]
最適化かくにん!

   よかった。

877 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 12:00:31.24 ID:vFMuIdhl.net]
やはり、最適化かかってんのね。
安心したけど書いてるのがもう少し速くなるかなと思ってたので、残念なような、、

linuxでgtk2hsでつくってたのをwin10に移植しようとしたら、うまくいかなかった。
gtk2hsの公式も落ちてたし、HaskellのGUIは今は何が主流 or ポテンシャル高い、なんですかね?

878 名前:デフォルトの名無しさん [2017/08/14(月) 14:52:12.07 ID:yxoqAlkZ.net]
すまん、いろんなモナドをJavaとかPythonとかのコードで
表してくれ・・・
なんとなく言いたいことは分かったとしても、はっきりとモナドが
なんなのかが分からない。
クラスとは何が違うのか。

879 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 15:06:44.92 ID:Au3l8RWH.net]
ひところ GUI の為の FRP に熱を上げていた連中は今、何に熱を上げてるの?



880 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 17:17:03.93 ID:emaMcYYJ.net]
>>868
>すまん、いろんなモナドをJavaとかPythonとかのコードで
>表してくれ・・・

JavaかPythonのスレ逝くべきだと思うの

>なんとなく言いたいことは分かったとしても、はっきりとモナドが
>なんなのかが分からない。
>クラスとは何が違うのか。

「なんとなく」もわかってないと思うよ

あと「モナドは自己関手の圏におけるモノイド対象以上でも以下でもない」が本質的な回答

881 名前:デフォルトの名無しさん [2017/08/14(月) 17:29:31.74 ID:yxoqAlkZ.net]
>>870
お、イキリオタクか?
平たい言葉で説明できないやつは無能なんだよなぁ・・・
自分は頭いいとおもってる??かっこいいね??本質的な解答とかいっちゃってさ

882 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 17:52:42.99 ID:emaMcYYJ.net]
CSにコンプレックスでもあんの?
テクニカルな概念をバカにわかるように説明しようとしてもムダってだけ

883 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 18:03:28.37 ID:HwAT4qGf.net]
春先Haskell熱心にやってたが
いまはCとかアセンブラとかそんなんばっかw

884 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 18:05:00.48 ID:HwAT4qGf.net]
圏論分からんのがここで
いくら吠えても無駄だとという…

885 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 20:12:02.36 ID:IonSoW2j.net]
「左辺 <- 右辺」の右辺をモナドという
左辺と右辺が等しいとは言っていないので制約が少なくて便利

886 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 20:17:22.67 ID:lpoYOEZY.net]
圏論を学ぶ為の知識がない

887 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 20:37:31.10 ID:IonSoW2j.net]
letとwhereが炎上したのも
等しいと書いてあるのに時間とメモリの消費が違うのはおかしいって話だよな

888 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 20:53:52.30 ID:FlMJ7oBL.net]
圏論もモノイドもわからなくてもHaskellでコード書くくらいは出来るけどな
もっと初学者への門戸を広げないと未来がない気がする

889 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 22:55:23.88 ID:CgEdc2Wx.net]
>>867
最適化オプションで差がほぼ無くなるんだから、
俺は、どっちの書き方でも良い ==> 読みやすい方で書けばOK となって嬉しいけどな。

GUI ライブラリの主流は知らんけど、ポテンシャル高いのは Web アプリ系だと思ってる。
Webブラウザを GUI のキャンバスにするタイプのライブラリ。

基本的にはどのプラットフォームでも同じように動く。
既存の Web アプリ用テストフレームワークが使える。
この辺り、ライブラリ開発者にもアプリ開発者にも大きなメリットで、
要するに開発がしやすい。
これからどんどん進化していく可能性が高いんじゃないかな。

そんなライブラリはいくつかあるけど、俺は threepenny-gui がおすすめ。
ヘンに小難しい EDSL が無く、概念が素直でシンプルだからプログラムしやすいよ。
stackage にも入ってるから導入が楽だしね。



890 名前:デフォルトの名無しさん mailto:sage [2017/08/14(月) 23:10:56.01 ID:/MmIRMIQ.net]
>>879
情報ありがとう。
良い機会だしThree pennyやってみるよ。
上ででてるFRPとかいうのもやれそうで面白そうだし。

891 名前:デフォルトの名無しさん mailto:sage [2017/08/15(火) 02:45:23.70 ID:NWVlMToc.net]
>>842
2014年とかめっちゃ情報古いのでアテにならんだろ

Revision history of "Let vs. Where" - HaskellWiki
https://wiki.haskell.org/index.php?title=Let_vs._Where&action=history

892 名前:デフォルトの名無しさん mailto:sage [2017/08/15(火) 16:18:56.38 ID:5CT1InAk.net]
Chris Okasakiの純粋関数型データ構造
Haskellを志すキッズはマストバイだわ

まだ3章だけど、木の値の更新でどうやって効率良く(更新しない部分を)扱ってるのか解ったわ

根元から辿って、毎回関係ない方を共有してけば確かに辿るステップ分のコピーしか発生しないわけだわ
対数オーダーになるわけだわ
なるほどなるほど

SML記法で書いてあるけどHaskell式としてもすぐに頭に入るわ

893 名前:デフォルトの名無しさん mailto:sage [2017/08/15(火) 17:50:51.72 ID:ukf6/i16.net]
ステマステマス

894 名前:デフォルトの名無しさん mailto:sage [2017/08/16(水) 10:19:38.26 ID:WjjZTNlo.net]
smlnj入れたけど全然勉強進んでないなそういえば

895 名前:デフォルトの名無しさん mailto:sage [2017/08/16(水) 15:19:53.05 ID:CVOJ5+kj.net]
ニュージャージーSMLは大学時代情報科学実験だか演習だかの簡易コンパイラ作製でひどい目にあった
Haskellに出逢えなかったら危うく関数型アレルギーになるところだった

896 名前:デフォルトの名無しさん mailto:sage [2017/08/16(水) 17:48:37.53 ID:i974/+KY.net]
stackで、stack buildしても上書きされなかったりします?
stack execしても、新しいのにならない、、

897 名前:デフォルトの名無しさん [2017/08/16(水) 20:37:22.91 ID:DL/Olpzx.net]
>>885
どんなとこが合わなかったの?

898 名前:デフォルトの名無しさん mailto:sage [2017/08/16(水) 23:08:21.23 ID:CVOJ5+kj.net]
・怒涛の再帰再帰再帰再帰の思考枠組みに悲鳴を上げる、手続き脳だった当時のボクの頭が

・末尾再帰最適化など実際(パフォーマンス)的なことを教えてくれず、代入なし、変更はコピーでやるとふわふわっと説明され、
(時間・空間)計算量的に現実には使い物にならないんじゃないかという疑念を払拭してくれなかった当時の講師(ボクはC++のように本格的でないものにはやる気が出ない性格)が

・演習に遅刻した奴への嫌がらせかと疑わしい程に沢山埋め込んであるレジュメの誤植を、口頭でちょろちょろっと訂正するだけのおざなり風土(レジュメだけでなくちゃんと教科書で進めろ)が

・できあがる、四則演算しかできない(途中アセンブリ言語に少し触れたのは良かったが)面白くもなんともない(ボクは本格的でないものにはやる気が出ない性格)糞仕様の言語(とそれ用コンパイラ)が

…ん? なんかほとんどニュージャージーのせいじゃないな

899 名前:デフォルトの名無しさん mailto:sage [2017/08/16(水) 23:58:51.50 ID:t3qJKwuj.net]
そういうの、よそのスレでやってくれないか



900 名前:デフォルトの名無しさん mailto:sage [2017/08/17(木) 07:36:41.55 ID:+LfjPFPQ.net]
すいません許してください。何でもしますから

901 名前:デフォルトの名無しさん [2017/08/18(金) 00:54:02.54 ID:/Ug8Ilbd.net]
モナドってインタフェースみたいなもんでいいのか?
つまりなんでもアリにしちゃうと、設計上様々な不整合があるから
「こういうモナド」を最初に規定してしまい、「モナドに合致しない」記述は
コンパイルで弾いてくれるの?

902 名前:デフォルトの名無しさん mailto:sage [2017/08/18(金) 01:40:52.19 ID:DcI2Tm3Y.net]
モナドはDSLプラットフォーム

903 名前:デフォルトの名無しさん mailto:sage [2017/08/18(金) 08:52:35.38 ID:JMfuFDdS.net]
文脈だって言ってんダロ
文脈を保ちながら普通の値と同じように扱うための規則を定めたものがモナド

904 名前:デフォルトの名無しさん mailto:sage [2017/08/18(金) 09:06:56.52 ID:t41bY7Zb.net]
haskellはモナドじゃないものもコンパイル通しちゃうよ
モナドであることの保証は自分でするしか

905 名前:デフォルトの名無しさん [2017/08/18(金) 09:22:11.27 ID:xzRfloCT.net]
>>891
モナドってより型クラスがインターフェースに近い。
んで、モナドは型クラスの一つでしかない。
等値を司るEq型クラスのインスタンスになれば=が使える。
大小比較を司るOrd型クラスのインスタンスになれば<や<=が使える。
それと同じ。
逐次処理を司るMonad型クラスのインスタンスになれば>>=とreturnが使える。
IOモナドはIO型を受け取るモナドってだけ。
素のモナドを使うのがほぼIO型しかないからIOモナドって一緒くたにされるけど、IOとモナドは分けて考える。

リストやMaybeもモナドのインスタンスなので、モナドでもある。

モナドが他の型クラスと違うのは、メソッド定義(インターフェースになる関数や演算子をインスタンスになる型で定義)の時にモナド則に則って書く必要があるということ。
それとモナド則を正しく定義できたかは型クラスには無関係なので、定義した人が正しさを保証する必要があるということ。

906 名前:デフォルトの名無しさん mailto:sage [2017/08/18(金) 09:38:38.34 ID:pIYVRSo1.net]
万能で汎用のDSLも作れるけどそれは手続き型言語と同じだから作らないんだよ
IOはごく一部で使われるDSLであるべき
他のところではIOとは別のDSLを使うべきという設計

907 名前:デフォルトの名無しさん mailto:sage [2017/08/18(金) 13:45:01.90 ID:/WLuQhbG.net]
Haskellによる手続き型言語の
分かりやすくて面白い実装きぼん
(学習用のおもちゃでよろし)

908 名前:デフォルトの名無しさん [2017/08/18(金) 20:36:40.41 ID:2JfViLUf.net]
>>891
ぶっちゃけていうとライブラリ実装者専用の
グローバル変数置き場って感じじゃね?
ライブラリのユーザはその中身は気にせずに使う。

909 名前:デフォルトの名無しさん mailto:sage [2017/08/18(金) 21:42:29.70 ID:XJnMHx6C.net]
ListTの使い方ようわかりまへん
do
x <- [1..9]
なんちゃらかんちゃら x

って、リスト感覚で使いたいんですが



910 名前:デフォルトの名無しさん mailto:sage [2017/08/19(土) 23:56:10.44 ID:3LWi1RRc.net]
直受けの50万 客:いつまでもうちにいていいよ
3次受けの50万(客は70万払ってる) 客:短期延長していい?
5次受けの50万(客は110万払ってる) 客:作り終わったらとっと出てけ できなかったら即退場だ 
長時間労働 高稼働 高スキル要求が多い

零細フリーランスサイトは5次受けから誰もできない難易度の高い仕事 余り物の仕事を紹介してくる。40万円代でやってくれと

これならJIETから3次でいったほうがいいな

446非決定性名無しさん2017/08/02(水) 22:12:48.95

JIETに毎月5千円払えば3次から入場できるだろ?
高額をうたうフリーランスのサイトはだいたい5次から45万円
JIETで閲覧応募できる末端価格からさらに搾取するのが高額をみせつけるフリーランスサイトでした
高額案件をみせつけるフリーランスサイトも案件の取得はJIETでした

473非決定性名無しさん2017/08/03(木) 15:21:30.71

JIETに加入すれば誰でも3次60万からスタートだ。フリーランスのサイトをやってる
自称エージェントもそこから案件情報を取得しきてる。サイトで60万で釣って40万から55万の
間でやらしている。

372仕様書無しさん2017/08/11(金) 10:31:43.41
フリーランスで検索すると引っかかる零細ITがやっているフリーランスのサイトはだめだ。
高額に見せているけど実際は50万前後
JIET加入した方がいいよ。案件は毎日千件以上末端価格は60万円 平凡な稼働時間の80万円の案件もある。
ユー子も求人をだしてる。名刺も渡せる。ユー子に名刺が渡せるんだぞ。夢のようだ

それらの案件まさぐってHPで転売していたのが零細ITがやるフリーランスサイト

自称エージェントはJIETから流れてくる案件を転売してるだけだった。
JIETに加入すれば誰でも案件に応募することができた。収入が40万50万台にならなくて済む

911 名前:デフォルトの名無しさん mailto:sage [2017/08/20(日) 03:21:02.15 ID:ZIcYkpAE.net]
>>899
x <- ListT $ return [1..9]
でもListTはモナドの結合則を破るというか
場合によっては幅優先になるから不用意に使わない方がいい

912 名前:デフォルトの名無しさん mailto:sage [2017/08/21(月) 00:38:33.62 ID:JGSk0hSy.net]
>>901
ListTには失望しました。もう積むのやめます

913 名前:デフォルトの名無しさん mailto:sage [2017/08/21(月) 01:01:09.86 ID:JGSk0hSy.net]
そもそもやろうとしてることに(よくよく考えたら)モナド変換必要なかった
本当に必要だったのは foldl でした

一方ロシアは鉛筆を使った

914 名前:デフォルトの名無しさん mailto:sage [2017/08/24(木) 13:28:03.79 ID:CtBOeO2p.net]
以下のhogeを定義してください

foldl' f a xs = foldr1 seq $ hoge $ scanl f a xs
hoge xs = ???

915 名前:デフォルトの名無しさん [2017/08/24(木) 19:41:48.97 ID:QM9NdRuY.net]
https://wandbox.org/permlink/HLJOHIGKIX8APzrZ

引数4つのfoldrがよくわからない
foldr f g [1..9] 707

916 名前:905 [2017/08/24(木) 20:30:17.00 ID:QM9NdRuY.net]
>>905は事故解決しました

917 名前:905 [2017/08/24(木) 20:49:44.49 ID:QM9NdRuY.net]
引数の適用順序の理解が足りないだけでした

f x = id id id id id id x

というのがあったら

f x = (((((id id) id) id) id) id) x

という感じに左から順番に適用されるんですね

foldr f g [1..9] 707 も (foldr f g [1..9]) 707 と括れば理解できました

918 名前:デフォルトの名無しさん mailto:sage [2017/08/24(木) 23:08:48.67 ID:RV3Vojhw.net]
Data.Map.findWithDefault について質問です

マップに存在しなかったからデフォルト値を返したのか、それともマップに存在したからそれを返したのか
一目判らないとき、デバッグでどうやって判定しますか?

919 名前:デフォルトの名無しさん mailto:sage [2017/08/24(木) 23:40:45.91 ID:Drr24sOi.net]
判定不可能でありそれが意図するところじゃね?
変な値をデフォルトに入れておくか
a->k->Map k a->Either a a的なのを用意するしかないんじゃ



920 名前:デフォルトの名無しさん mailto:sage [2017/08/25(金) 00:15:34.79 ID:eQ9TUNW0.net]
findWithDefault d k m = maybe (trace "default" d) (trace "existed") $ Map.lookup k m

921 名前:デフォルトの名無しさん mailto:sage [2017/08/25(金) 05:39:52.91 ID:Qp5pyEwS.net]
>>910
やったぜ。ドバァーっとヒット/ミス/更新がその時の検索キーと共に時系列で出てきた。 もう気が狂う程気持ちええんじゃ。
ログまみれのコンソールを見つめてメモ化再帰の効果を確認したりした。ああ〜〜たまらねえぜ。(ありがとうございました)

922 名前:デフォルトの名無しさん mailto:sage [2017/08/25(金) 06:18:21.22 ID:eQ9TUNW0.net]
わろた

923 名前:デフォルトの名無しさん mailto:sage [2017/08/26(土) 04:35:19.01 ID:gyHjYOL6.net]
>>910
ポイントフリー化に成功しました

findWithDefault = curry.(.uncurry Map.lookup).(`maybe` trace "existed").(trace "default")

https://ideone.com/RVpv4o

924 名前:デフォルトの名無しさん mailto:sage [2017/08/29(火) 10:59:59.32 ID:4lrctZxR.net]
新しい言語を勉強してると「Haskellならこう書けるのになんだかな〜」となってしまう

925 名前:デフォルトの名無しさん mailto:sage [2017/08/29(火) 14:36:34.73 ID:Qxc6OkmQ.net]
Haskell書いてると「OCamlならこう書けるのになんだかな〜」となってしまう

926 名前:デフォルトの名無しさん mailto:sage [2017/08/29(火) 14:47:58.47 ID:Ca4b6AZL.net]
そま?例えば?

927 名前:デフォルトの名無しさん mailto:sage [2017/08/29(火) 16:59:34.07 ID:weKjOry2.net]
岡村の方が速いらしいっすよ。でも、そうですね…やっぱり僕は、王道を征く、Haskell系ですか

928 名前:デフォルトの名無しさん mailto:sage [2017/08/29(火) 19:06:06.26 ID:Qxc6OkmQ.net]
多相ヴァリアント

929 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 16:54:11.68 ID:osPI36Tt.net]
双方向リンク系のデータ構造って、Haskell で作るのムズいね。
作るだけなら良いけど、更新時の処理で頭こんがり。

任意のノードに外部からアクセス用リンクが張ってあると
もう訳分からん。



930 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 17:07:44.85 ID:YH54NEsT.net]
そういうことするなっていう設計の言語で強引にしようとしたらわけわからなくなるよ

931 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 17:18:14.50 ID:osPI36Tt.net]
>>920
そういうことするなってのは入門書には書いてないじゃん。
じゃあ、ちょっくらやってみようか、ってなるのがプログラマでしょ。

できるかもしれんし、できんかもしれん。

まぁ、かなりムズいなってのは体験して分かった。

932 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 17:24:15.30 ID:YH54NEsT.net]
>>921
あー。Haskellでは状態を変更しない為に単方向リストを用いるって書いてなかった?

933 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 17:35:40.48 ID:osPI36Tt.net]
>>922
リストの定義とか使い方とかは載ってたけど、
なんで単方向のなのかの説明は無かったよ。
「Haskell:The Craft of Functional Programming」
「Beginning Haskell: A Project-Based Approach」

934 名前:デフォルトの名無しさん mailto:sage [2017/08/30(水) 17:47:54.21 ID:YH54NEsT.net]
マジかぁ……

935 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 03:30:11.22 ID:lYwDQiZm.net]
Purely Functional Data Structuresなら触れられてるかと思って探してみたけど
そもそも双方向連結リスト出てこないな(´・ω・`)
でも永続データ構造の概念を知ればなぜ扱われていないかが分かるだろう多分

936 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 05:24:22.47 ID:8YNqT7yd.net]
何で双方向リストの必要なんかあるんですか
途中で戻るとか男らしくないっすよ

937 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 07:18:24.63 ID:3UP7YVEo.net]
>>926
巨大な双方向グラフを作ることになったんだけど、 使い方は次の通りちょっと特殊。

* あるノードにアクセスしたら、その近隣のノードも集中的にアクセスすることが多い
* ノードが持つ値の読み書きアクセスが圧倒的に多く、グラフの形を変えることは少ない
* ノードの値の書き込みアクセスよりは読み取りアクセスの方が多い

既存の汎用的なグラフ ライブラリと、双方向リンクで自作したグラフ ライブラリとで、
どっちが効率いいか実験してみようと思ったんだ。

でも双方向リンクは、ひとつのノードの値を変えるためにどうしてもグラフ全体を作り直す羽目になる。
どうにかならんものかと考えてたけど、どうにもならんね・・・

938 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 09:37:24.20 ID:z8GPJM/w.net]
「doubly linked list haskell」でググって適当な実装拾う

939 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 11:49:25.22 ID:lYwDQiZm.net]
すごハスにあるようなZipper構造かな必要なのは



940 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 12:38:50.35 ID:cadjyHiv.net]
書き換えしないんだったら ([a], a, [a])  みたいなので充分なんだよな
コモナドにしてどうたらとか余計な話も無視して

941 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 12:49:49.13 ID:3UP7YVEo.net]
あの、欲しいのはリストじゃなくてグラフなんだ。
だから、zipper 系とは違う。

942 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 14:03:01.85 ID:UJfUdOL2.net]
最低限木じゃないと効率的かつ単純なのは無理なんじゃないかな?
あんま自信ないけど

943 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 14:05:39.83 ID:3UP7YVEo.net]
皆のレスがどうも勘違いしてると思ってたら、
俺が最初に双方向リンクと言ってしまったからか。

ごめん、相互リンクだ。

944 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 14:16:21.20 ID:3UP7YVEo.net]
>>932
木構造でも、親ノードへのリンクを入れると相互リンクになって難しくなるよね。

ひとつのノードの値を変えるためには、
ツリー全体を作り直すことになるんじゃないかな。

HaskellのDOMツリーのデータ構造とかどうなってるんだろ・・・

945 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 14:36:16.80 ID:3UP7YVEo.net]
よく考えたら、リストとかツリーでも、
途中のノードの値を変えたかったら、
そのノードまでリンクで繋がってる全ノードは、
新しくリンクを張り直さなくちゃいけないんだね。

946 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 16:07:16.49 ID:ByIgTrbm.net]
そうです。途中の値の変更は
リストならO(n)
ツリーならO(log n)


947 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 17:20:58.63 ID:UJfUdOL2.net]
>>934
ランダムアクセスしないなら木に入れなくてもその都度親リストを作ればいいんだけどね
なおかつそれをカーソル的に使ってやれば平均で更新のコストも減らせる
ってこれzipperか

948 名前:デフォルトの名無しさん [2017/09/01(金) 01:21:03.60 ID:5J9AnuIe.net]
何が何でも1つのプログラミング言語で何とかしようとするのって
異国に行っても母国語で通そうとする観光客と同じ

949 名前:デフォルトの名無しさん mailto:sage [2017/09/01(金) 06:41:46.01 ID:YbmVmXZP.net]
>>938
ひとつの言語がどこまでできて、何が得意で何が苦手なのか、
ひとつの言語に集中してそういうのを学ぼうとするのも、
おまえの言う「母国語で通そうとする観光客」カテゴリに入るのか?



950 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 01:43:24.06 ID:6rFZUKZZ.net]
>何が何でも1つのプログラミング言語で何とかしようとするのって
>異国に行っても母国語で通そうとする観光客と同じ

こういうやつにかぎってポリグロッタルコストを甘く見てる

951 名前:デフォルトの名無しさん [2017/09/02(土) 02:26:59.07 ID:zv/5K5Jn.net]
私はHaskell以外のプログラミング言語で書く気はありません

952 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 03:52:13.44 ID:qGW8qyv/.net]
慣れるまで大変だけど、慣れたら居心地いい気がする

953 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 07:28:06.22 ID:pdF7ruXY.net]
困ったらFFIでC呼び出せばいいだけだから助かる

954 名前:デフォルトの名無しさん mailto:sage [2017/09/08(金) 23:35:36.55 ID:r8Qtf4kd.net]
ICFP 2017 で発表された資料、成果や知見はどこかで後悔されたりしないんですか?
動画が公開されてるんなら、有料でも見たいです。

955 名前:デフォルトの名無しさん [2017/09/09(土) 18:15:24.47 ID:lkyt770O.net]
発表者各自が公開してるの地道に探すしかねーんでないの

ICFP Conference(@icfp_confere

956 名前:nce)さん | Twitter
https://twitter.com/icfp_conference
[]
[ここ壊れてます]

957 名前:デフォルトの名無しさん mailto:sage [2017/09/09(土) 20:11:43.28 ID:TPWLKlk7.net]
>>945
やはりそうですか。

毎年そうやって発表者や参加者の発信を探すのですが、
分散しており、詳しいことは書いてないことも多く、
情報集めに苦労する割には、たいてい徒労に終わります。

有料でいいので公式がまとめて公開してくれるといいのにと
ここ数年つたない英語でメールを出しているのですが、
相手にしてもらえませんね。

すいません、愚痴でした。

958 名前:デフォルトの名無しさん [2017/09/09(土) 23:36:02.27 ID:9IxpzJRD.net]
icfpが何なのか知らないけど「icfp video」「icfp paper」で検索してみた
ICFP Video - YouTube
https://www.youtube.com/channel/UCwRL68qZFfub1Ep1EScfmBw
gasche - GitHub
https://github.com/gasche
ICFP 2016- Proceedings of the 21st ACM SIGPLAN International Conference on Functional Programming
www.sigplan.org/OpenTOC/icfp16.html
フェイスブック、レディっと、ラムダザウルチメイトなどの良く知られた媒体でも
事前告知や事後報告があると思う

959 名前:デフォルトの名無しさん mailto:sage [2017/09/10(日) 00:33:58.75 ID:et8drD+r.net]
>>947
指摘を受けて、もしかしてと思い、改めて公式サイトの中を探してみましたら、
paper は公開されていることが分かりました。

過去のも見てみましたら、去年のもの paper にはアクセスできるようでした。
(その前のは公式からはリンクは張られていない模様)
video も年によってはリンクが張られていたりします。

なかなかぱっと見では分かりにくいところにリンクがあるのですが、
やはり探し方が悪かったみたいでお恥ずかしいです。


ちなみに、ICFP は国際的な関数型言語の会議です。
使う側、処理系側双方の最新情報を発表したり、
ワークショップが開かれていたりします。



960 名前:デフォルトの名無しさん [2017/09/11(月) 00:32:10.78 ID:Xe2WUSa/.net]
問題解決もしくは近づいたのなら何よりです

961 名前:デフォルトの名無しさん mailto:sage [2017/09/11(月) 23:17:06.08 ID:NiRp1zJ5.net]
Haskellの正規表現ってどのライブラリを使うのが無難?
Text.Regex.Posixをimportしようとすると、Text.Regex.BaseかText.Regex.PCREの間違いじゃね?って言われて困惑

962 名前:デフォルトの名無しさん [2017/09/13(水) 18:15:30.36 ID:15e8c4wP.net]
(´・ω・`)あのー
なにかおすすめの参考書ありませんか?
初心者です
むちゃくちゃ簡単でやさしく書いてるのが良いです
アマゾンで見つけて最近出たみたいなんだけどこれはどうなの?



Haskellによる関数プログラミングの思考法 https://www.amazon.co.jp/dp/4048930532/ref=cm_sw_r_cp_api_ozpUzbZS57HY2

963 名前:デフォルトの名無しさん mailto:sage [2017/09/13(水) 19:15:57.75 ID:jV0bEQ9+.net]
正直Haskellで「簡単でやさしく」は無理です
諦めてすごいH本やHaskellWikI,Hoogleや各種書籍、サイトを何度も往復して苦しみながら覚えてください

964 名前:デフォルトの名無しさん [2017/09/13(水) 19:18:52.25 ID:15e8c4wP.net]
(´・ω・`)はい

965 名前:デフォルトの名無しさん mailto:sage [2017/09/13(水) 19:53:59.78 ID:4h5PMlCQ.net]
すごいHaskell楽しくなんとかって奴がいいらしいよ
あとリアルワールドHaskell

966 名前:デフォルトの名無しさん mailto:sage [2017/09/14(木) 00:00:37.91 ID:55xYcYks.net]
https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E8%A8%98%E8%BF%B0%E8%A8%80%E8%AA%9E

HaskellベースのHDLってけっこう 多いのな
ビックリした

967 名前:デフォルトの名無しさん mailto:sage [2017/09/14(木) 01:28:21.76 ID:kgKbKDJJ.net]
>>951
他の人も書いてるけどやはり「すごいHaskell」がとっつきやすさは高いと思う
それでいて内容もちゃんとしている
「関数プログラミングの思考法」もいい本だとは思うのだが
目的がアルゴリズムデザインとかの方面であんまり初心者向けっぽくない

968 名前:デフォルトの名無しさん [2017/09/14(木) 06:01:32.83 ID:yKCuCAfu.net]
>>954
>>956
(´・ω・`)すごいHaskell読んでみます
ありがとー

969 名前:デフォルトの名無しさん mailto:sage [2017/09/14(木) 09:24:06.36 ID:ux4IsQoU.net]
英語が読めればwikibooksのやつもどうですか?
自分は"プログラミングHaskell"から入ったので初見じゃないですが、良さげに見えます。
内容も定期的に更新かかってますし。



970 名前:デフォルトの名無しさん mailto:sage [2017/09/14(木) 10:02:22.29 ID:Yrr+4vGX.net]
「しゅごいHaskell」はダブルVサイン出しながら
読まなきゃいかんのでキーボードが打てない

971 名前:デフォルトの名無しさん mailto:sage [2017/09/14(木) 16:15:03.19 ID:fLwKChPf.net]
What does it mean?

972 名前:デフォルトの名無しさん mailto:sage [2017/09/14(木) 23:15:23.23 ID:BKIQZ2N0.net]
He probably meant Haskell wikibook page is upto dated. And that is also why I recommend it for beginners too.

973 名前:デフォルトの名無しさん mailto:sage [2017/09/15(金) 08:29:13.24 ID:K8WAqD4o.net]
>>957
あなたがそもそも関数型プログラミングに慣れ親しんでいないのであれば、まずはそこが第一の壁となるでしょう
まずはリストをメインに再帰やマッピング、畳み込みといった操作に慣れましょう
またHaskellはデフォルトでカリー化されているのでその妙味も十分に味わいましょう

次に壁となるのは、型や型クラスでしょうか?
ここではクラスやインスタンスといった単語が出てきますが、それらはいわゆるオブジェクト指向で使われているものとは意味が全く違うので注意してください
型に慣れ親しみ、常に適切な型を選択できるよう意識してください
そうすればコンパイラがあなたの強い味方となってくれます

最後に入門者の壁となるのは、おそらくモナドでしょう
モナドは数学の圏論由来の概念ですが、別段圏論に詳しくある必要はありません
基本的な部分では、モナドは単なる文脈であり、文脈を表すためのコンテナです
しかし、それ以上に高度で抽象的なことをやろうとすると、その理解では行き詰まるかもしれません
そんなときは、圏論に軽く触れてみるのもいいでしょう
少なくともかの有名な
「モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?」
をざっくりとでもいいので理解できれば、新たな視界が開けると思います

Haskellは簡単な言語でもやさしい言語でもありませんが、その代わり高度に抽象化された、バグの少ないプログラミングが可能です
あなたの成功を心より祈っています

974 名前:デフォルトの名無しさん mailto:sage [2017/09/15(金) 08:57:14.76 ID:8dqnOzco.net]
歳を取って反射神経鈍ってくると一々詳細を語るのが億劫になって抽象的なまま話を進めたくなるよね
Haskellは抽象的にプログラミングするインフラを整備している?

975 名前:デフォルトの名無しさん mailto:sage [2017/09/15(金) 18:00:40.28 ID:d/L5NKte.net]
Map a (Map b c)

Map (a,b) c


どっちが速いかみんな一度は悩んだことあると思う

976 名前:デフォルトの名無しさん mailto:sage [2017/09/15(金) 22:35:43.14 ID:znUIhbu+.net]
悩まんでしょ

977 名前:デフォルトの名無しさん mailto:sage [2017/09/15(金) 22:47:16.31 ID:eUG8Jdoq.net]
コンパイルしたらどうせ一緒になると思って適当に書いてたけど、変わるの?

978 名前:デフォルトの名無しさん mailto:sage [2017/09/15(金) 23:09:08.09 ID:4fuQ9N5K.net]
Mapは平衡二分探索木だから各Map b cのサイズに開きがあると遅くなるね

979 名前:デフォルトの名無しさん mailto:sage [2017/09/16(土) 13:16:45.55 ID:u+a6R9+A.net]
newtype F a b c = F (Map a (Map b c))
newtype G a b c = G (Map (a, b) c)

これでFとGはどうせ一緒のクラスになる
こういうポリモーフィズムの意味がわかってる人は速さで悩まない



980 名前:デフォルトの名無しさん mailto:sage [2017/09/16(土) 15:43:07.25 ID:QR311jcD.net]
それは実装を隠蔽しただけで速さの悩みを解決したわけではないのでは…
もちろん実装を隠蔽しておいて後でより速い実装に
容易に交換できるようにしておくのは大変有用だが

981 名前:デフォルトの名無しさん mailto:sage [2017/09/16(土) 20:52:50.94 ID:u+a6R9+A.net]
pi :: Floating a => a

円周率piの値を隠蔽し精度の悩みを解決

982 名前:デフォルトの名無しさん mailto:sage [2017/09/16(土) 21:24:55.55 ID:MfZyyhcD.net]
今更だけど、いつの間にか cabal のバージョンが 1 から 2 になってる

なんか大きく変わったの?

983 名前:デフォルトの名無しさん [2017/09/17(日) 08:09:36.24 ID:QPoZRnuU.net]
>>4にある解説ページをちらっとみた
たしかに数式に似た感じでものすごく簡単に書けるみたいだね
たしかに直感的だとおもった

984 名前:デフォルトの名無しさん mailto:sage [2017/09/21(木) 22:09:47.22 ID:1QLcw3LX.net]
haskellコンパイラはユーザ定義のモナドが
モナド則満たすことを
チェックしてくれない所がウンコ

985 名前:デフォルトの名無しさん mailto:sage [2017/09/21(木) 23:00:55.55 ID:gD1zcn0E.net]
そんな超能力コンパイラがあるですか?

986 名前:デフォルトの名無しさん mailto:sage [2017/09/21(木) 23:55:50.59 ID:Y0fSMmUh.net]
QuickCheck的なのがコンパイル時に走ってチェックしてくれたりするように
そのうちならないかなー

987 名前:デフォルトの名無しさん mailto:sage [2017/09/21(木) 23:58:25.67 ID:h/TDh704.net]
モナドを自作したことがないから後学のためにどういう状況でどういうモナドを自作すると効率的なのか教えていただけると幸いです

988 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 00:28:53.04 ID:kX95feab.net]
適当に型を作ってたら実はモナドだった、みたいな

989 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 16:55:50.20 ID:xffnPG6j.net]
原理的にモナド則のチェックの自動化は不可能なの?
圏論マスターでも無理なの?



990 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 17:04:50.24 ID:uYwUnAnO.net]
ゲーデルさんに聞けばわかるかも。

991 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 17:56:16.78 ID:4/60bB6Q.net]
ユーザが書いたモナドであることの形式的証明を
検証出来る処理系なら有るはず。
Coq辺り。

992 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 19:52:40.81 ID:uE400tii.net]
Vectorパッケージで、基本Unboxedにして、
Unboxedに出来なければBoxedにする、
途中でUnboxedにできるなら戻す、
でのを手でやってるのですが、スマートなやり方ってありますか?

993 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 02:53:52.53 ID:7lhkarx+.net]
QuickSpecならなんとかしてくれる
かもしれない

994 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 20:42:11.20 ID:WVPJPMdD.net]
stack プロジェクト内の cabal ファイルの build-depends の項に sdl2 を書き込んで、stack build コマンドを実行しました。
すると、sdl2 パッケージのビルドでエラーが出て、「-fPCI を付けて再コンパイルしてください」と出力されました。
そこで stack build --ghc-options="-fPIC" コマンドを実行してみました。
しかし、それでも同様のエラーが起き、ビルドできません。

stack による sdl2 パッケージを利用するプログラムをビルドするにはどうすれば良いでしょうか。

995 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 21:51:07.20 ID:58d35SiT.net]
>>983
stack.yaml に、
ghc-options:
sdl2: -fPIC
を追記すればOK。たぶん。
https://github.com/commercialhaskell/stack/blob/master/doc/yaml_configuration.md#ghc-options

996 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 22:50:55.76 ID:WVPJPMdD.net]
>>984
やってみましたが、結果は変わりませんでした。

今使っている lts-9.5 の snapshot が
~/.stack/snapshot/x86_64-linux-tinfo6-nopie/lts-9.5
にあるのですが、nopie とあり、何か問題に関係ありそうなのですが、どうでしょうか。

997 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 23:32:36.23 ID:58d35SiT.net]
>>985
うーん、なんだかよくわからないけど、リンクフェーズで”recompile with -fPIC”と言われてしまう問題が報告されていて
https://github.com/commercialhaskell/stack/issues/2712
https://docs.haskellstack.org/en/stable/faq/#i-get-strange-ld-errors-about-recompiling-with-fpic
これによると、Arch Linux では ncurses5-compat-libs をインストールすると直るらしい。

998 名前:デフォルトの名無しさん mailto:sage [2017/09/24(日) 10:57:49.47 ID:G5x2bhDn.net]
>>986
とりあえず先に進めるようになりました。
アドバイスありがとうございました。

たしかに私は ArchLinux を使っています。
Haskell の問題にディストリビューションの違いが絡んでくるとは考えていませんでした。

はじめ ncurses5-compat-libs をインストールしただけでは解決されませんでした。
(ログインし直しても)

そこで stack を一度綺麗にアンインストールしてから再インストールし、
それでもダメで、更にビルド時に -fPIC オプションを付けたらエラー無く通りました。

何が原因で処置がどう働いてこういう結果になったのか、まだ何となくでしか分かりませんが、
とにかく SDL を用いたプログラムを試すことができるようになり良かったです。

999 名前:デフォルトの名無しさん mailto:sage [2017/09/25(月) 22:51:00.48 ID:xypOJPnn.net]
集合Aと整数mを引数に取り、Aの可能なm分割全体から成る集合Mを返す関数を作りたいです。
(m分割とは集合論的にm個の集合に分割することとする)

例:
集合 A = {a, b, c, d} と m=2 を引数に取ると、下記の集合Mを返す。
M = {{{a}, {b,c,d}}, {{b}, {a,c,d}}, {{c}, {a,b,d}}, {{d}, {a,b,c}}
, {{a,b}, {c,d}}, {{a,c}, {b,d}}, {{a,d}, {b,c}} }

集合を表す型は何でも良いです。
Data.List でも Data.Set でも、その他の型でも。

Haskell で効率よく書けるでしょうか。
ここでいう効率とは、空間よりも時間を優先します。
空間も小さければ尚良いですし、ソースが綺麗ならいっそう良いです。

かれこれ一週間ほど考えていますが (と言っても四六時中ではありませんが)、
なかなか良いアイデアが浮かびません。

前もって言っておきますが、実際の集合Aのサイズはせいぜい20程度で、分割数も2に固定です。
質問のきっかけとなった問題は愚直に実装して解決しました。
なので、この質問は純粋に頭の体操、ゲームです。



1000 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 00:11:58.02 ID:lGqC8DP/.net]
集合の任意の要素m個(nCm)に1〜mの番号を重複なく振る(順列m!)、残りの要素に1〜mの番号を適当に振る(m^(n-m))

1001 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 07:15:14.90 ID:YKUYL+7U.net]
>>989
その方法ですと重複が起きます。
極端な話、集合 {a, b} を 2 つに分割する場合、
番号 1 と番号 2 を重複無く振る方法は2通りあります。
1. a=1、b=2
2. a=2、b=1
残りの要素は無いのでそのまま目的の集合を作ると、
どちらの方法で作っても同じ集合 {{{1}, {2}}} になります。

最後に重複をまとめて排除するのでしょうか。

1002 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 07:27:48.34 ID:8PxDtYJG.net]
部分集合作って差集合とのタプルにして最後に重複省くくらいしか思いつけない

1003 名前:デフォルトの名無しさん [2017/09/26(火) 07:50:17.87 ID:gfUhXOzb.net]
{a, b, c, d, e}でm=3なら

{a, b, c, d}でm=3のときの答えのリストにmap(:)'e'
それに加えて、{a, b, c}でm=2のときの答えに(:)'e'

集合の長さとmが同じならそのまま返す

みたいな感じじゃダメ?

1004 名前:デフォルトの名無しさん [2017/09/26(火) 07:51:32.23 ID:gfUhXOzb.net]
訂正
{a, b, c, d}でm=2のときの答えに(:)'e'

1005 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 10:27:56.68 ID:g1C4tf16.net]
>>992
>>993
要素数5でm=3なら、結果の集合の要素数は25ですけど、
その方法で25個すべて出ます?

1006 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 10:46:10.91 ID:cHfS1yYI.net]
inter :: a -> [[a]] -> [[[a]]]
inter x = go
 where
   go [] = []
   go (y:ys) = ((x:y):ys) : map (y:) (go ys)

part :: Int -> [a] ->[[[a]]]
part _ [] = []
part 1 xs = [[xs]]
part k (x:xs) = map ([x]:) prev_ks ++ concatMap (inter x) ks
 where
   prev_ks = part (k-1) xs
   ks = part k xs

main = print $ part 3 [1..4]

1007 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 21:54:38.15 ID:YKUYL+7U.net]
>>995
素晴らしいです。

正直 >>992 の時点では意味が分からなかったです。
(答えに (:a)'e' とか)
コード見て意味が分かりました。

1008 名前:デフォルトの名無しさん mailto:.sage [2017/09/26(火) 23:41:18.71 ID:pHNMsW6Q.net]
n個の異なる要素のリストから[3,3,4,1,8,...]などとサイズ指定リストに従って分割するときの全列挙をするにはどうしますか?

分割はサイズ以外に見分けはつかないものとします

[[a,b,c],[d,e,f]]

[[d,e,f],[a,b,c]]はダブルカウントです

1009 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 23:55:56.84 ID:LAGAI/jv.net]
分割の言葉のお前の定義からきかせてもらおうか。英語でok



1010 名前:デフォルトの名無しさん mailto:sage [2017/09/27(水) 00:47:00.32 ID:wiD7jN/4.net]
bunkatsu "abcdefghij" [1,2,3,4]
なら
[["a","bc","def","ghij"],...みたいにです

1011 名前:デフォルトの名無しさん mailto:sage [2017/09/27(水) 01:19:52.15 ID:iTQClNYA.net]
>>999
listl take 自然変換

1012 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 254日 1時間 35分 58秒

1013 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






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

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

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