[表示 : 全て 最新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/

464 名前:デフォルトの名無しさん [2017/05/14(日) 18:19:44.55 ID:lQnp4gVk.net]
flipの呼び出しコストって無視できるの?

465 名前:デフォルトの名無しさん mailto:sage [2017/05/14(日) 18:24:38.81 ID:I4CZOOoh.net]
uncurryなんかもカッコいいなぁ (かなり使った
ただポイントフリーは、一度くっつけたのをまたバラす時に頭が痛くなる
一種の(視覚的な)最適化なので、頻繁に組み替えてる最中にはやりたくない

466 名前:デフォルトの名無しさん mailto:sage [2017/05/14(日) 19:03:34.66 ID:X8FkgiaC.net]
>>458
最適化でインライン展開されるんじゃない?

467 名前:デフォルトの名無しさん mailto:sage [2017/05/15(月) 00:57:14.99 ID:ICbTDVni.net]
ポイフリしたら型シグネチャ添えてる。本末転倒かね?

468 名前:デフォルトの名無しさん mailto:sage [2017/05/15(月) 06:58:21.61 ID:3pbiASso.net]
>>461
それを本末転倒かもと考える事が本末転倒だよ。
大事にするところがおかしい。
コードスタイルを決めるのは何にもまして読みやすいか、考えやすいかどうかだよ。
(もちろん誰が読む、考える人かによる)

型シグネチャを添えるかどうかは本質的にはポイントフリーしたかどうかに関係ない。

・そもそも添えないと(意図したように)コンパイルできないから添える。
・添えた方がコードを読みやすい or 考えやすいから添える。
・添えない方がコードが読みやすい or 考えやすいから添えない。

これ以外の理由ってある?
(書籍に載せるのに紙面を節約するため、という理由は排除)

ちなみに俺個人は、添えた方が読みやすいし考えやすい。
どんな関数でも本体を定義する「前」に型シグネチャを書く(と言うか思い浮かべる)。
OOPにおけるインターフェース志向設計みたいなもの。

469 名前:デフォルトの名無しさん mailto:sage [2017/05/15(月) 08:50:26.75 ID:fFRu606n.net]
いやおかしくないでしょ。
ポイントワイズなコード にするか、型シグネチャ付けるかは悩んでもいいでしょ。

コードは短い方が読みやすい。冗長でない方が読みやすい。
しかし一時変数や型注釈は別のレベルでの理解しやすさを与えてくれる。
それらを使うか、使うならどっちか、両方か、はケースバイケースだし職人芸的な深みがあると思うよ。
場合によっては関数名の類似だけで事足りることとかあるでしょう。

個人的なバランス感覚としては、なるべくポイフリするがflipは使わない、トップレベルの型シグネチャはほぼ付ける、ただし書き捨てコードは別。
(ルークよ、セクションを使え…)

470 名前:デフォルトの名無しさん mailto:sage [2017/05/15(月) 09:43:58.61 ID:WwceF0p9.net]
使い捨てやモナドの途中でletした関数も漏れなく型シグネチャ付けるの?

471 名前:デフォルトの名無しさん mailto:sage [2017/05/15(月) 10:00:25.10 ID:3pbiASso.net]
>>464
俺(>>462)に言ってるのかな。

俺は内部関数にはシグネチャーは基本的に書かない。
(内部関数自体、ほとんど使わないけど)
ごめん、どんな関数でもと言ったのは、トッブレベル関数のことだ。

あと、今のコーディングスタイルにしてからは、
Haskellでいわゆる使い捨てコードというものを書かないようになった。

472 名前:463 mailto:sage [2017/05/15(月) 11:04:15.21 ID:fFRu606n.net]
>>464
俺は書くときもある。でもそういう時は大抵、設計を練り直すハメになる。
なるべく上の層を充実させたいよね。

>>465
使い捨てコード書かないのは、どうなんだ。
ちょっとした実験というかお遊び的プログラミング、粘土コネコネはしないのかい。
いやでも、作っても結局設計しっかりしてないと長持ちしないなら、初めから気合い入れて製作すべきなのか。
その方がトータルのコストは節約できるということか。ううむ。



473 名前:デフォルトの名無しさん mailto:sage [2017/05/15(月) 11:55:36.63 ID:3pbiASso.net]
>>466
実験は基本的にちょっとしたものでも捨てない。
結果的に後で捨てることになるかもしれんが、
捨てるつもりで実験はしない。
実験の目的や結果などをメモって残しておく。

実験の時も本番の時も思考の順は同じだから、まず型から考える。
だからシグネチャは書く。

お遊びは、ごめん、その状況がよく分からん。
コードを書くことを遊びにできる心は、揶揄でも何でもなく素直に感心する。
羨ましい。

粘土は要するに実験と同じだよね。
だからシグネチャは書くよ。

474 名前:デフォルトの名無しさん mailto:sage [2017/05/15(月) 12:23:22.28 ID:19VlPgPR.net]
入門者のおれには勉強になる。
Stateとか使って型推論させると、MonadState使ったかなり複雑なシグネチャが出てくるんだけど、
あれはなるべく汎用的なシグネチャにしておくのがいいのかな?それとも具体的なシグネチャにするほうがいい?

475 名前:デフォルトの名無しさん mailto:sage [2017/05/15(月) 12:29:59.58 ID:Nyf5aX+C.net]
>>465の言ってる「使い捨てコード」は単に無名関数くらいの意味合いじゃない?

476 名前:デフォルトの名無しさん mailto:sage [2017/05/15(月) 13:07:35.87 ID:3pbiASso.net]
>>468
そりゃ、汎用的な関数を定義したかったら汎用的なシグネチャを書くし、
具体的な関数を定義したかったら具体的なシグネチャを書くよ。
モナドトランスのスタックがいつく積まれていようが関係ない。

あと、スタックがいくつも積まれた姿を常に目にしていると思考しにくい時もある。
そんな時は type で別名を付けて分かりやすくする。

すべては自分が考えやすく、書きやすく、読みやすくするため。

>>469
無名関数にシグネチャって
map ((\x -> if even x then 1 else (-1)) :: Integer -> Int) [1..9]
みたいにか?

それは無いでしょ。
>>464 がそんなことを聞いてるとは思えん。
まぁ、書かなきゃコンパイルできない場合もあるかもしれんが、
今のところ、そんな状況になったことは一度もない。

>>464 のレスを見て俺が想像した使い捨てコードはまさに >>466 の言うような「捨てる前提の実験コード」だよ。
それはやらなくなったから >>465 で捨てコードは書かなくなったと言ったんだ。

477 名前:デフォルトの名無しさん mailto:sage [2017/05/16(火) 23:36:00.24 ID:qM3Y9DLE.net]
圏論を学んでみたい Haskeller、学ぼうとしたけど入門辺りで挫折してしまった Haskeller へ。

「圏論勉強会」なる一連の動画が youtube にアップされている。
(第13回まであって、それぞれ約2時間ある)
何年か前からアップされているので、知ってる人も多いと思う。

時々、Haskell で表現するとこんな感じ、といって実演して見せてくれるから面白いし、理解しやすい。

第1回はイントロダクション的な回で、圏論の雰囲気を掴むのが目的だから浅くサクサク進んでしまう。
だから難しく感じるのは当たり前なので、ここで諦めてしまわないように。
第2回からは圏論を学ぶ前の準備的な話からゆっくり丁寧に進むので安心して。

とりあえず全部一気に流して見て、2周目からじっくり学びながら見よう、
という学習スタイルはおすすめしない。
それだと1周目はテレビを何となくダラダラ見るのと同じで、何も理解できず、2周目に繋がらない。
(書籍なら自分のペースで読めるので、このスタイルでもいいと思うけどね)

それでは時間の無駄で、それなら初めから2周目のつもり挑んだ方がいい。
細かく一時停止して、今の話本当に理解できたかな、どこが理解できなかったんだろ、
といちいち理解度を確認しながら見ること。
また、動画内で例がいっぱい出てくるけど、自分でもオリジナルの例を作ってみるといい。

理解できたあかつきには、圏論はもちろん、Haskell がもっと面白くなる事を保証する。

478 名前:デフォルトの名無しさん mailto:sage [2017/05/16(火) 23:59:22.93 ID:Jwz5jkYk.net]
圏論が分からん? 頭悪過ぎだろ。
まあコーダーなんてそんなもんかw

479 名前:デフォルトの名無しさん mailto:sage [2017/05/17(水) 00:22:14.16 ID:aIm9uZNt.net]
圏論どうこう以前に文系出身だから数3Cすらわからんわ
すまんな

480 名前:デフォルトの名無しさん mailto:sage [2017/05/17(水) 02:00:03.36 ID:v4KZ2kPE.net]
数学教室 πの焼き方 日常生活の数学的思考って本が圏論入門以前としては良いかも。
触り程度だけど、圏論出てる。

481 名前:デフォルトの名無しさん mailto:sage [2017/05/17(水) 03:53:13.08 ID:t193iX6C.net]
さわりの誤用警察だ! 大人しくしろ!

482 名前:デフォルトの名無しさん [2017/05/17(水) 09:13:07.50 ID:DVfwNdKJ.net]
Haskell固有のコーディングスタイルって何種類くらいあるの?それらのスタイルに名前あったりするの?



483 名前:デフォルトの名無しさん mailto:sage [2017/05/17(水) 09:48:25.92 ID:mHKUfv3k.net]
shadowingも再代入できないから'を連打するパターン

484 名前:デフォルトの名無しさん mailto:sage [2017/05/17(水) 09:51:42.83 ID:uSaEsMW/.net]
>>476
Haskell固有のコーディングスタイルって何?
たとえはどんなの?

485 名前:デフォルトの名無しさん mailto:sage [2017/05/17(水) 10:55:39.88 ID:knf86SYT.net]
圏論のアイデアを盗むのは難しくない
盗用しても、そんなの圏論じゃないから盗作じゃないもんみたいな反応なので盗み放題

486 名前:デフォルトの名無しさん mailto:sage [2017/05/17(水) 21:31:17.54 ID:yFIpJ9bF.net]
>>471
いい大人が2時間x13回なんて時間取れるかよ!ぼーっと見てるだけなんてダル過ぎ

…でもありがとう

487 名前:デフォルトの名無しさん mailto:sage [2017/05/17(水) 22:56:48.03 ID:Noyf0zx+.net]
>>476
まだ関数脳が出来てない時は、副作用のない関数でも手続き的な書き方するけど、関数脳が出来上がったら自然と宣言的に書いていくから、コーディングスタイルと言えるようなのは段階を踏んで成長していくもの。

そう言うのじゃなくてインデント以外にも書き方あるのかと言われれば、ある。
ブレース構文と呼ばれるCっぽい書き方。

main = do { cs <- getContents;
putStr cs}

こっちはインデントに左右されない自由に書ける。

レイアウトまたはオフサイドルールと呼ばれる書き方はPythonと同じ、インデントを考慮しないとコンパイル出来ない。
こっちが主流。

ちなみに、ポイントフリースタイルはコーディングスタイルではなく、カリー化の部分適用で見た目の引数を減らす関数の書き方。

488 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 00:25:41.41 ID:XBCR7g9y.net]
x:xs みたいな変数名の使い方ってHaskell的だよね
関数名に意味を込めておいて変数名は短く簡潔な方がいいみたいなスタイル

489 名前:デフォルトの名無しさん [2017/05/18(木) 00:27:12.80 ID:xYh7ZO1T.net]
>>476

GitHub - jaspervdj/stylish-haskell: Haskell code prettifier
https://github.com/jaspervdj/stylish-haskell

GitHub - commercialhaskell/hindent: Haskell pretty printer
https://github.com/commercialhaskell/hindent

GitHub - evolutics/haskell-formatter: Haskell source code formatter
https://github.com/evolutics/haskell-formatter

490 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 00:38:06.79 ID:EVp+48v/.net]
Haskellの関数のアリティは常に1なので「カリー化」も「部分適用」も存在しない

491 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 02:12:52.06 ID:yXJEanSW.net]
Text.Printfのprintfはスゴイことをやってることはわかる
いまだに似たようなものを書くことができない

492 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 03:37:21.45 ID:/F28r+D1.net]
>>482
引数の時点で使いたい構造に分けておくのは気に入ってる。
使わない部分は'_'で明示出来るし。

f xs -- リスト全体
f (x:xs) --リスト先頭と残り
f xxs@(x:xs) -- リスト全体とリスト先頭と残り同時利用
f (x:y:zs) -- リスト先頭から2個と残り



493 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 03:42:59.76 ID:znop8OGf.net]
遅延評価分かってるつもりだったけど分かってないな
オライリーの並列本で、次のような式があって、force使ってたら並列処理に回される前に評価されて意味無いんじゃって思ってしまった

rpar (force (map solve as))

これって、rpar引数の式が式のまま引数として渡されて、rparが並列処理内で引数を評価しようとしたタイミングでmapとforceが評価されるって理解でいいのかな?

値の遅延評価は何となく頭に入ってたけど関数の評価については意識できてなかった

494 名前:デフォルトの名無しさん [2017/05/18(木) 07:48:58.07 ID:u6B8rj4W.net]
rparが来た時点で次のrpar,rseqと並列に実行し始めるという風になってるから遅延評価とは違う?ような気がする

引数を正格にするのは単に並列化済みのそれぞれの処理を速くしたいという意図では

495 名前:デフォルトの名無しさん [2017/05/18(木) 07:52:51.48 ID:fP2O3mzY.net]
force自体の評価は遅延されるからね
式はまだ評価されてない値と考えればいい

496 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 07:58:02.16 ID:ZMFFk1e9.net]
パターンマッチの分岐を確定するのに必要な分だけ評価する
Identityモナドみたいなやつでも⊥ではないことを確定する必要があれば評価する

497 名前:デフォルトの名無しさん [2017/05/18(木) 08:06:27.16 ID:u6B8rj4W.net]
ではなく、評価の深さに関係してるみたいですね。rparがWHNFまでしか評価しないので。rseqでも同じかな?

498 名前:デフォルトの名無しさん [2017/05/18(木) 08:12:32.69 ID:u6B8rj4W.net]
>>491>>488に対してです。

>>489
それでは、rseqが呼ばれるまでrparの引数が評価されないように感じるんですが、いつ評価が始まるんでしょうか?

499 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 08:41:17.48 ID:IzAvSK7+.net]
やるなら並列にやる(いつやるとはいってない)

これが初心者キラー

500 名前:デフォルトの名無しさん [2017/05/18(木) 09:02:29.66 ID:fP2O3mzY.net]
>>492
forceという関数そのものは特別扱いされないって意味
ちなみにrpar自体が引数をWHNFまで評価すると理解してるけど試せる環境がないから断言は出来ないな
forceが必要なのもWHNFの時点でrparのスパークが終わっちゃうからだと思ってるけど・・・

501 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 12:53:58.06 ID:hXrMTvib.net]
>>482
関数自体の汎用性とか短さも関係してると思う
変数名が具体的でなくとも何してるかパッと見てわかる関数は嬉しい

502 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 14:10:00.91 ID:TSzqrQQ0.net]
>>487
forceはリストの背骨までしか評価しない。
つまり

xs=[1,2,3,4,5]



xs=[_,_,_,_,_]

と評価される。

でも、そのforceもリストが評価されるまで動かない。。。
マジで並列化と遅延評価は相性悪い。



503 名前:デフォルトの名無しさん [2017/05/18(木) 15:07:11.90 ID:S+9vOUwt.net]
いやControl.DeepSeqのforceは再帰的に評価する
というのもリストのNFDataインスタンスはNFData a => NFData [a]だからね
head $ head $ force [[1,undefined]] はエラー

504 名前:デフォルトの名無しさん mailto:sage [2017/05/18(木) 17:35:00.25 ID:znop8OGf.net]
force自体は何も特別では無くて遅延評価される
但し、force関数の評価時に本来はWHNFまでしか評価しない状況でもNFまで完全評価するって感じか

505 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 05:58:24.02 ID:7XmC+xMs.net]
faithandbrave.hateblo.jp/entry/20111201/1322718742

GADTs拡張で、空でないリストを前提にコーディングできるみたいですけど、
これって、静的に空でない事が判明してないと呼び出せないんですか?
空か入ってるか判らないリストについては使えないってこと?
凄い使いにくそう

506 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 06:15:33.02 ID:eorHP7jS.net]
NonEmptyは何かしらのモデリングを行うときにパラメータが非空リストであるといった内部で生じる条件を明に扱えるようにするためのものかと思ってる
インポートした関数をつなぎ合わせるだけの部分で便利なものではない

507 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 18:25:30.00 ID:SgRoQNx5.net]
printf関数は副作用のある出力関数じゃなくて、フォーマット済みの文字列返すだけの副作用のない関数にして欲しかった。。。

508 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 18:29:29.96 ID:1KTJ7Tkv.net]
sprintfよろ

509 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 18:59:49.62 ID:SgRoQNx5.net]
本当、それ欲しい->sprintf

510 名前:デフォルトの名無しさん mailto:sage [2017/05/20(土) 19:27:54.16 ID:3Ne2dZP6.net]
import Text.Printf

genMsg :: String -> String
genMsg name = printf "Hello, %s-san!" name

main :: IO ()
main = do
  name <- getLine
  putStrLn $ genMsg name

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]
なぜ自分は変じゃないと思えるのか……






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

前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