関数型プログラミング言語Haskell Part31©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/09/27(水) 02:33:08.70ID:2XAqPuH2
関数型プログラミング言語 Haskell について語るスレです。

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

前スレ
関数型プログラミング言語Haskell Part30
http://mevius.2ch.net/test/read.cgi/tech/1484491434/
2018/07/04(水) 06:46:15.75ID:We7MgVDS
>>609
matplotlibやpandasあたりは、
そのためだけに、Python使うくらいのライブラリだから、
他の言語に使いたいライブラリがあれば、
その言語を使うで使い分けで良いんじゃない。
Excelの読み書きもなんかもPython使ってるよ。
2018/07/04(水) 07:58:03.61ID:RQ3++Y83
HaskellのシンタックスのPythonが欲しい
2018/07/04(水) 09:21:13.05ID:NlExtjkH
>>611
HaskellのComplexで四則演算などをしようとすると
各要素はRealFloatクラスのインスタンス (いわゆる浮動小数点数)である必要がある
Ratio a はRealFloatのインスタンスになれないので計算できない
こうなってる理由はざっくり言えばHaskellのNumが悪い
(参考: https://blog.miz-ar.info/2016/06/haskell-num-class/#abs_signum )
615デフォルトの名無しさん
垢版 |
2018/07/04(水) 11:08:34.25ID:y2B7jfXw
>>614
ありがとうございます。
Ratio a 割り算できるのに駄目なんですね。
別法考えます。
2018/07/04(水) 11:21:15.35ID:rsOJUgV3
>>609
例えば QuickPlot (https://github.com/sheegl/QuickPlot)
そこそこモダンな描画を行うライブラリでしたが、
README.md にあるとおり、もうメンテナンスは行われていません。
ビジュアライゼーションサーバーのクライアントを作る方がより効率的だから、だそうです。

私もそう思います。
haskell でグラフ描画ライブラリを作るなら、
・データの作成 (取得や加工、整形など)
・サーバーへアクセスするためのインターフェース
この2点の実装に絞りたいですね。

データの作成は、python では Pandas のデータフレームを挙げていますが、
haskell ではこんなのはどうでしょうか。
https://github.com/chrisdone/labels/tree/master/labels-explore

あと、gnuplot を卑下してるようですが、そんなにダメですか?
私には視認性の良いグラフに見えますけど。
Wikipedia のグラフにも使われていますし。
2018/07/04(水) 14:52:23.98ID:okkM4kUQ
gnuplot も悪いとまでは言わないが、昔の解像度が低く色数もあまりなかった時代に最適化されてる気がするんだよ
Python のグラフと、微妙に用途が違うのかもしれないが

Python のグラフ
ttps://seaborn.pydata.org/examples/index.html
2018/07/04(水) 16:23:51.06ID:rsOJUgV3
>>617
すいません、違いがよくまかりません。

gnuplot デモ
http://gnuplot.info/demos/

私には低解像度&少色数時代の環境に最適化されているようにはどうしても見えないです。
2018/07/04(水) 19:14:51.99ID:J/c/gMh10
会社のプレゼンに使うならPythonの例の方がオシャレに見える
しかしオシャレなグラフというのは見栄え以外の面では役に立たない
620デフォルトの名無しさん
垢版 |
2018/07/04(水) 21:47:59.97ID:gFgZc5FG
MY6
2018/07/05(木) 02:06:23.28ID:4KPVS4+Q
その無駄に思えるオシャレが大事なんだぜ
2018/07/05(木) 06:27:20.02ID:fgqUaerO
Pythonの例として上げられてるのは、seabornという
1. Rからデザインと
2. 人気のあるデータ表示方法
をパクって、同じことをmatplotlib.pyplotを裏で使ってお手軽にできるようにしたパッケージであって、
素のmatplotlib.pyplotのグラフはgnuplotのデフォルトと変わりのない見た目ですよ

gnuplotだって、山ほど表示用オプションがあって綺麗に表示できます
2018/07/05(木) 09:04:27.74ID:HeNpkv8u
>>622
gnuplot でお手軽に綺麗に表示できるようになってるの?

話が逸れたが、ある程度データ構造が共通に使えて
目的に応じて使えるかなり機能も見た目も
良くできたグラフライブラリが幾つかある、ってのが Python の状況だよ
個人的にはHaskell でそれが出来りゃ嬉しいが、、
Python は実行しないとエラーが出ないから、げんなりする時もある

教えてもらった labels- explorer は面白そうなんで見てみるよ
2018/07/05(木) 12:35:27.07ID:aP+h4Ji7
>>623
綺麗にできるかどうかは使用者のセンスに依ると思います。
python の方のサンプルは、単に淡い色を使い、
線を太めに表示しているだけに見えますが、違いますか?
他に python のグラフならではの特徴があれば言ってください。

下記のような設計のライブラリがあればあなたの要望は満たされますか?

1. 見た目が python のサンプルの様になる「デザインのプリセット」がある。

2. pandas のデータフレームに似た使い勝手の「2次元の表」からグラフを生成できる。

3. 上記1. 2. を満たせば、グラフの生成自体は gnuplot に任せても良い。
2018/07/05(木) 18:25:11.62ID:rB4OVQ4f
一見丁寧に見えてなかなかに辛辣でワロた。
2018/07/05(木) 18:32:51.78ID:Ia+ptacm
そんなところ頑張りたくないからデフォルトで一般受けする図を出せる奴が欲しいってだけの議論でなんでこんな白熱するんだ
2018/07/05(木) 18:54:20.69ID:rB4OVQ4f
>>626
Pythonユーザーの視点、て一言がたぶん余計だったと見受けられる。

Haskellな人、でググると逆の気持ちが分かるかと。
2018/07/05(木) 21:16:31.45ID:aP+h4Ji7
勘違いしているようですが、python 視点とかはどうでもいいです。
要は、希望されている機能がどれだけ楽に実装できるかが問題なんです。

その「頑張りたくないからデフォルトで」がプリセットの提供で満たせ、
かつ gnuplot を使ってもいいのなら、
見た目の部分は頭をそれほど使わず実装できそうです。

また、データフレーム的なデータ構造も、
もうメンテされてなさそうですが、labels-explore で賄えます。

となれば、ライブラリの形はインターフェースを簡易化したラッパー的なもので十分。

一から作るより遙かに楽です。

でも、私の指摘の他に python のグラフならではの特徴があり、
それを求められているのであれば、実装が難しくなり、
正直腰が引けます。
そのための確認です。
2018/07/05(木) 21:59:46.30ID:LtuS5J6M
普通にいける範囲なら実装してくれるってこと……?
神かよ
2018/07/05(木) 22:39:32.46ID:JLdZJLqI
Pythonならでは、って訳じゃないが(むしろ Rのパクリだと思うが)
facet とかいうグラフを二次元の表に並べたオシャレなグラフは欲しい
軸はグラフ毎に共通にできたりバラバラにできたりする
seaborn の facetgrid ってクラス見てくれ、map でグラフ書いたりしてて、ちょっと関数型言語の影響がありそうだから

あとは逆にHaskell ならではの良さが出るかどうかだな
2018/07/05(木) 23:17:35.48ID:mFkifadT
> Haskellならではの良さ
フーム
2018/07/05(木) 23:22:55.84ID:aP+h4Ji7
>>630
複数のグラフを並べるのは、gnuplot では、このサンプルの一番下のものですね。
http://gnuplot.sourceforge.net/demo_5.0/layout.html

すみませんが、python 自体は昔に少し触ったくらいで殆ど門外漢です。
不慣れなものを調べるのは面倒で、そこまで労力や時間をかけたくないです。
あくまで、暇ができるのでやってみましょうか、という話です。

なので、実装してほしい事は自分の口で、
python を知らない者にも分かるように説明してください。
それでも、あまりに大変そうならお断りするかも知れませんが。

あと何度も言いますが、オシャレなグラフになるかどうかは個人のセンスですので、
そんなものはライブラリに期待しないでください。
ある程度のプリセットは用意しようと思いますが、あくまで私のセンスです。
普通は利用者がパラメーターを調整して自分でオシャレに仕上げるものです。
2018/07/06(金) 00:29:48.55ID:qcgYo1MM
それはいけない。
現にSeaborneはおしゃれに仕上げて来ているので、Pythonならライブラリに期待できるのにHaskellでは期待出来ないということになってしまう
2018/07/06(金) 01:50:57.76ID:nHf3/Uiq
>>633
プログラミング言語を用いてグラフを作る目的は、
データの取得、加工、整形までをサクッとプログラムしたのだから、
そのデータの全体像を捉えるための可視化も「ついでに」してしまおうというもの。

つまり、プロセッシングしたデータの特徴を「すぐに見たい」という要求に応えるもの。

その様な目的のグラフに求めるのは、データの様相を正しく映すこと。
オシャレなんて入る余地は微塵もありません。
(例えば haskell には使用メモリ量をプロファイルしたデータのグラフ化ツールがありますが、
そのグラフにオシャレさは必要でしょうか)

もし、人にカッコイい思われるグラフを作りたいとか、
人にインパクトを与えるグラフを作りたいという目的ならば、
なにもプログラミング言語を使わなくてもいい。

というのが、古臭いかもしれませんが、私の考えです。

なので、あくまでオシャレなグラフを作るライブラリを求めているのでしたら、
私のモチベーションは大きく下がるので、
この件から降ります。
2018/07/06(金) 02:04:10.34ID:qcgYo1MM
>>634
そういう考えなら降りた方が良いと思うよ
2018/07/06(金) 05:21:13.62
なんでオシャレにしないといけないんですか(正論)
2018/07/06(金) 06:38:28.09ID:hZ+CPQ2X
自己肯定感かな
論理に自信があるなら論理だけでいいがそうでなければオシャレが必要なような気がする
2018/07/06(金) 06:41:34.00ID:2hmUlp+S
何がオシャレなのかを定義して
正確に人に伝えるところからじゃないの?
2018/07/06(金) 07:12:51.82ID:hZ+CPQ2X
もし定義できないならできないと伝えるのが正しい言葉なんです
2018/07/06(金) 07:46:50.10ID:vkH0MZEq
ユーザーは最初から見た目を重視してんのに、ここにきていきなりオシャレは必要ないって突っ返すのは、
さすがにPythonがどうとかHaskellがどう以前にコミュニケーション不全
2018/07/06(金) 08:37:44.78ID:ODtONBJi
万能なプリセットなんておれは期待してないから、
適当なのを真似るだけで全然問題ないよ
ただ別に金出してるわけでもないから、おれは好き勝手書いてるけど別に従う必要はないよ

あとちょっとグラフに対するおれの感覚と違っているようだから書いておく

少なくとも今は、一種類のデータだけじゃなく、沢山の種類のデータを見たい人がいるんだよ。
そういう人にとっては、情報は圧縮されていて欲しい。忙しいから、全体を見たいんだ。
例えば一台の使用メモリ量じゃなく50台のを見たい、とかだよ。
そんな時に、50枚のグラフを渡されて一個一個が完璧に可視化しているでしょ、とか言われたら困る。

画面に収まるようにするには、削ってもいい情報を削り、例えばfacetみたいな方法でまとめるしかない。
かといって圧縮しすぎても分からなくなるし難しいけどね。
2018/07/06(金) 10:10:20.21ID:nHf3/Uiq
>>641
> 画面に収まるようにするには、削ってもいい情報を削り、例えばfacetみたいな方法でまとめるしかない。
> かといって圧縮しすぎても分からなくなるし難しいけどね。

私は「全体像」を捉えるための可視化と言っています。
細部を見るための可視化とは言っていません。
(50個分のグラフで表されるデータの全体像を捕らえたいという要望に、
50枚のグラフを作るなど愚の骨頂)

そして、それはあなたがオシャレではないと感じている gnuplot でできますよね。
gnuplot のサンプル見ましたか?

gnuplot でもできることは理解したけど、
オシャレではないので却下という事ですか?
2018/07/06(金) 11:23:26.70
長い棒グラフを端折る為に、下端を0以外の数値にしちゃうとか、マナー違反しない限りもう好きにやってくれ
2018/07/06(金) 11:46:42.42ID:aeaUac9w
オシャレって結局UXだからね
手軽に良いUXが得られる方を使うのは自然っちゃ自然なわけで
2018/07/06(金) 14:15:19.37ID:hZ+CPQ2X
UXを定義できないなら予測もできない
予測できると思ってるならやっぱり定義するべき
2018/07/06(金) 18:44:45.57ID:aeaUac9w
UX自体の定義は単純だよね
プロダクトによってユーザーが得る経験
良し悪しになると一意には定まらないけど良い悪いのアンケでも取って統計的有意差を得られれば良い悪いとしていいと思う

もし客観主義として定義可能なものしか定義と認めないと言うならお手上げだ
良いUXが得られるとされるプロセスには既にアンケなどによるユーザ要求の明確化が含まれてしまうからね
2018/07/07(土) 09:26:18.48ID:IVdrrdB1
アンケ取って結果を発表するところまで全部がUXになるからお手上げだな
放○線を測定して数値を報道するみたいなUXだ
2018/07/07(土) 11:29:34.03ID:o7Nl1O6h
出来ない出来ないと言い訳ばかりして実際出来ているPythonから目をそらす
2018/07/07(土) 11:58:08.73ID:IVdrrdB1
プロシュー○「出来る…そんな言葉は使う必要がねーんだ。」
2018/07/07(土) 12:00:36.05
たかがグラフ一つでいつまでもスレを汚さないで
もっと本格的な話をして
2018/07/07(土) 21:46:46.78ID:amcAQv9O
質問

let a = takeWhile p $ sort xs
これって、どこまでソート処理されるかは、
xs の並び方と条件 p によるよね
(厳密にはaの評価方法によるけど)

今のsortの実装は確かマージソートだったはずだから、
極端な話、条件に合う要素がただ一つだけ先頭にあれば、
ソート処理はすぐに終わると思っていい?
2018/07/07(土) 23:14:16.03ID:CxD5piUN
>>651
そういう意図なら
sort $ takeWhile p xs
じゃないかな
最初に書いてある式だと、takeWhile p が引数のリストを評価しようとしたときに
sort xsの第一要素を見る必要があるのでxsをソートし終わらないと評価が進まないはず
2018/07/08(日) 00:09:13.07ID:Xnl3te8c
マージソートでマージが遅延されるならhead $ sort xsはO(n)だと思う
いい感じの説明用コードが思いつかないけど
あとたぶん例のクイックソートも
2018/07/08(日) 00:15:59.84ID:Xnl3te8c
あークイックソートは先頭だけでも最悪O(n^2)になったりするか
2018/07/08(日) 01:32:29.33ID:fmVgo5Ue
>>652
オレ >>651

つまりはn要素のリストのsort後の先頭m要素 (m<n) を評価するのは、
n要素を評価するより少ない計算量で済むんじゃないか、という質問なんだ

だから sort と takeWhile を入れ替えたら意味ない
2018/07/08(日) 01:40:40.69ID:fmVgo5Ue
ふと思いついたが、比較関数に unsafePerformIO を入れて比較回数をカウントすれば分かるかも

今は実験環境が無いから、起きたら試してみる
お騒がせしてごめん、という結果になるかも

お休み、お前ら
2018/07/08(日) 09:12:56.04ID:fmVgo5Ue
実験したら、やっぱり評価に必要な部分しかソートされなかったよ
実験は takeWhile じゃなく take でやった

[実験コード]
ucomp :: IORef Int -> Int -> Int -> Ordering
ucomp ref x y = unsafePerformIO $ do
modifyIORef ref (+1)
return $ compare x y

main = do
let g = mkStdGen 1
let xs = shuffle' [1..8] 8 g
rc <- newIORef 0
let ys = take 8 $ sortBy (ucomp rc) xs
putStrLn $ show $ maximum ys
c <- readIORef rc
putStrLn $ show c

take で取り出す要素数を8個と3個で実験し、show c の結果を比較
  8個 c=19
3個 c=14

やっぱ遅延評価ってイイね
ベスト3を決めるのに他言語みたいに全部を評価する必要がない

ちなみに、100万個の要素でもやってみた
  all c=19237801
  3個 c=1413225

質問したけど、ひとりで納得してしまった、すまん
2018/07/08(日) 09:49:58.54ID:ZNji3Zip
>>657
>ベスト3を決めるのに他言語みたいに全部を評価する必要がない
別に他言語でも全部を評価する必要はない。
https://ja.wikipedia.org/wiki/%E9%81%B8%E6%8A%9E%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
2018/07/08(日) 10:45:22.88ID:JJmFxw3L
どんな言語だろうが全部ソートすれば O(n*log(n)) で最小値や最大値を探すのは O(n)

この n と n*log(n) の差を無視できないなら
そもそも n と 100*n の差を無視するのもダメじゃないかと思う
2018/07/08(日) 11:20:47.41ID:fmVgo5Ue
>>658
いや、そうじゃなくてさ

上位m個の選択処理とソート処理とをソース上ではきっちり分けてるじゃん
ソースを読む人間にとってはすげー読みやすいわけよ

なのに内部処理的には2つが連携して、
必要なところまでしかソートされないだろ
選択処理のためにワザワザ特殊なソート処理をしなくてもさ

そこがすげーって感動してるんだよ
2018/07/08(日) 11:30:44.71ID:Xnl3te8c
まあソートなんて如何にもキャッシュ次第なアルゴリズムで
連結リストと遅延評価のO(N)が配列と正格評価のO(NlogN)に
現実的なNの範囲で勝てるのかものかどうか・・・
662デフォルトの名無しさん
垢版 |
2018/07/08(日) 13:00:05.06ID:MJ8iSrG7
まるで永久機関の話を見ているようだ
2018/07/08(日) 22:57:14.98ID:wt6yCeB5
具体例や比喩で抽象度を下げるのは良い
だが「永久機関っぽいもの」の集合を作ったらむしろ抽象度が上がり収拾がつかなくなる
2018/07/09(月) 10:04:31.05ID:pOD9hGUD
arrayパッケージのData.Array.(!)はO(1)ですか。
665デフォルトの名無しさん
垢版 |
2018/07/11(水) 00:08:42.37ID:l1CMhfek
Haskellの採用とユーザ満足度が向上
https://www.infoq.com/jp/news/2018/07/haskell-user-survey-2018
666デフォルトの名無しさん
垢版 |
2018/07/13(金) 00:35:06.69ID:vrIUPTb8
発展編! Haskellで「型」のポテンシャルを最大限に引き出すには?【第二言語としてのHaskell】
https://employment.en-japan.com/engineerhub/entry/2017/10/03/110000
2018/07/14(土) 09:44:23.46ID:sMbeASmt
yampaムズ過ぎ

初心者用のシンプルで教育的なチュートリアルって無いの?
英語でもいいから教えて
2018/07/15(日) 00:11:52.51ID:89Btz4it
>>677
Yampaエアプだが、このサイトが良さそうだ
http://bitterharvest.hatenablog.com/archive/category/Haskellプログラミング講座(上級編:ゲーム)
2018/07/15(日) 05:50:15.76ID:uHtx5/Ti
>>668
申し訳ない

そこは、FRPの基礎概念である「ビヘイビアとイベント」と、
Yampaの基礎概念である「シグナル関数」との繋がりが言葉で説明されていないんだ

コードを書きまくって慣れろ、って感じ
2018/07/15(日) 08:13:24.43ID:89Btz4it
>>669
フーム
ビヘイビアは Time → a でイベントは [ (Time, a) ]
シグナル関数は (Time → a) → (Time → b)
のようなことが 「FRPの話 - maoeのブログ」で少しだけ説明されているね。

もう少し長い解説をElm開発者の人が論文に書いてた。
http://elm-lang.cn/assets/papers/concurrent-frp.pdf
2018/07/15(日) 08:23:05.35ID:89Btz4it
>>665 ほらね、Haskell普及のためにはツールの拡充が必要なんだよ。
https://github.com/alanz/vscode-hie-server/pull/83
これこれこういうのを待ってた。emacs対応はよ
2018/07/15(日) 09:30:20.96ID:uHtx5/Ti
>>670
ありがとう
両方読んでみる
2018/07/27(金) 11:27:32.40ID:qBTTu3Zk
importのhidingとかqualifiedとか適当にやってるせいで、いつも収拾がつかなくなってる。

ブラックリストかホワイトリストか、asで名前付けるのはどんな時か。みんなどうしてるの?
2018/07/27(金) 21:52:57.03ID:lmpcLfYu
>>673
私も知りたいな。

私の場合は、頻繁に使うもの以外は、
qualified as してる。

そして、asでつける名前にいつも悩む。
675デフォルトの名無しさん
垢版 |
2018/07/29(日) 20:22:22.75ID:tC3jGbCj
インポートリストをざっと見ることで、モジュールの役目が何となく掴めて嬉しい。たとえば
import Data.Text.Lazy
import Text.Parsec
だったら、ああなんかをパーズするんだな、と分かる。

一方、
import Math (sin,cos,tan)
みたいになっていても、このモジュールは三角関数を使うやつ、ということは判るが、それが大して役に立つとは思えない。

だから値の明示的インポートはやめて、hidingだけに統一しようかな、と考えてる。
値がバッティングして、かつ両方使いたいならそのモジュールは qualified する。
2018/07/29(日) 20:25:02.63ID:tC3jGbCj
>>674
基本大文字を拾って as している。
import qualified Data.Map as M
import qualified Data.Set as S
だが
import qualified Text.Regex.TDFA as TDFA
つらい
2018/07/31(火) 21:58:40.13ID:6DhCQI2V
https://github.com/trekhleb/javascript-algorithms/issues/119

岡部健、更新。
2018/08/11(土) 12:54:39.21ID:dGCQYNDS
get programming with haskell 読み終わった。
2018/08/12(日) 03:22:15.33ID:fh95vopi
>>678
感想は?
2018/08/12(日) 09:41:11.96ID:mCQrOvpG
>>678
凄いハスケルより初心者向きで実用的でわかりやすい。
2018/08/12(日) 11:23:29.51ID:1lJIW3H3
>>680
実用的というのは?
何かアプリケーションを作るの?
2018/08/12(日) 11:30:59.98ID:mCQrOvpG
>>681
アプリケーションは作らないけれどコマンドラインのプログラムは作る。
2018/08/12(日) 17:25:24.07ID:1lJIW3H3
もしかしてFRPとマルチスレッドって相性悪い?
2018/08/12(日) 18:12:55.83ID:HMPSYWub
新分子設計は並列処理を酷使するだろうが
強化プラスチックが特別どうということはないだろう
2018/08/12(日) 18:50:22.57ID:RPd+D2gX
>>684
FRPの有限要素解析?
2018/08/12(日) 19:11:53.89ID:OVUWpXpl
>>26
2018/08/13(月) 06:20:04.15ID:HYnqBmQs
いいねえ。気軽に使えるからコマンドラインは好き。
自分で使うツールを作るのが一番モチベ上がるね
2018/08/13(月) 14:03:54.60ID:DTF7R3qv
Get Programming with Haskellはタイトルのとおり初心者向けの本だよ
600ページの本で400ページ超えたところでstack導入して、
あとは、簡単なコマンドラインツール、http、JSON、dbおさわりくらい
それまでは、ghci使ってhaskellの学習
689デフォルトの名無しさん
垢版 |
2018/08/26(日) 22:17:17.61ID:hKYk5Tea
Haskell開発ワークフロー。お前らはどれ?
1. stackの--file-watch
2. ghciの:r
3. ghcid
4. エディタのフック
https://www.fpcomplete.com/blog/2018/08/haskell-development-workflows-4-ways
2018/08/27(月) 22:15:37.17ID:8S3lymML
今やすいぞ 多分半額程度

ソフトウェアシステムアーキテクチャ構築の原理 第2版
https://www.amazon.co.jp/ソフトウェアシステムアーキテクチャ構築の原理-第2版-ニック-ロザンスキ-ebook/dp/B00ZF44J0I/ref=tmm_kin_title_0?_encoding=UTF8&qid=1535375513&sr=1-1
2018/08/29(水) 13:20:47.63ID:nTrDfIjn
>>689
俺は2
692デフォルトの名無しさん
垢版 |
2018/09/04(火) 09:34:44.70ID:0nZVvdsT
カリー化された関数の表記がよく分かりません。

add' :: Int -> (Int -> Int)
add' x y = x + y

↑これはどうやって解釈すればいいのでしょうか?
add' は関数を返す関数であるにもかかわらず、 = x + y となっているので数を返す関数のように見えます。

↓このλ式を使った表記は何の問題もないと思います。

add = \x -> (\y -> x + y)
693デフォルトの名無しさん
垢版 |
2018/09/04(火) 09:40:03.69ID:0nZVvdsT
add x = \y -> x + y

これでも問題ないと思います。
2018/09/04(火) 10:34:46.73ID:ntR3woJY
Int -> (Int -> Int) も
Int -> Int -> Int も同じやろ

add 1 2 としたらIntになるし
add 1 としたらInt -> Intの関数が得られる
それだけ

更に引数3つとるaddなら
add = \x -> (\y -> (\z -> x + y + z))
と同じ意味だし、haskellはデフォでそういう仕組になってるってことやろ
695デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:40:17.26ID:0nZVvdsT
>>694

ありがとうございます。

add' :: Int -> (Int -> Int)
add' x y = x + y

↑この表記って、よくない表記じゃないですか?

add' x y = x + y

↑これをみて、型が add' :: Int -> (Int -> Int) だとはとても分かりません。
2018/09/04(火) 10:48:31.75ID:W1MTXd47
じゃあどんな型だと思うんだい?
2018/09/04(火) 10:48:48.98ID:ntR3woJY
逆にそれ見たらどういう型だと思った?
Int -> Int -> Int
って思ったんじゃない?

なんの本読んでるかしらんけど
例えば add x y z なら Int -> Int -> Int -> Int だけど
実際には
Int -> (Int -> (Int -> Int))
こうなってるってことを言いたいんやろ
698デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:50:47.26ID:0nZVvdsT
>>696

add' :: Int Int -> Int

という型に見えます。
699デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:52:13.57ID:0nZVvdsT
1 2

のように整数をスペース区切りで二つ並べたものに対して、

1 + 2

を対応させる関数に見えます。
700デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:54:55.24ID:0nZVvdsT
関数を返す関数なんですから、

=

の右には数ではなく関数を書くべきです。
701デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:57:59.07ID:0nZVvdsT
f x = x + 2

などの例を見て、

f ● = ■

という表記は、

f(●) = ■

という意味かと思います。
2018/09/04(火) 11:29:45.35ID:ntR3woJY
add は関数を返す関数じゃなくて引数を2つとって値を返す関数やろ
そこでもう勘違いしとる
add 2 3 の結果は関数じゃなくて値やろ?
add 2 のように引数を一個だけ渡したら部分適用されて引数を一個とる関数が返るってだけや

haskellはそういう部分適用できる関数を書きやすいように
add x y = x + y を add = \x -> (\y -> x + y)に自動で変換してくれるってだけ
糖衣構文ってやつ
嫌なら全部ラムダ式で書けばいいよ
2018/09/04(火) 11:41:42.58ID:W1MTXd47
>>698
じゃああなたが今勉強してるカリー化って何なんですかね?
2018/09/04(火) 12:05:07.87ID:/45N32wx
**argv :: char
*argv :: char*
argv :: char**

add' x y :: Int
add' x :: a -> Int
add' :: b -> a -> Int

C言語を学習した人はHaskellも分かる
これが知能だ
2018/09/04(火) 12:52:41.14ID:JkSql3w1
Haxe では関数の型は、
function sum (a:Int, b:Int) : Int

Int -> Int -> Int
引数1 -> 引数2 -> 戻り値

最後は戻り値
2018/09/04(火) 12:54:41.46ID:tHCjwI0T
>>701
Haskellは関数適用が最優先だから
add' x y は (add' x) y って意味
だから add' x y = x + y は
「add' にxを適用した結果にyを適用した結果はx+yに等しい」と読める

ちなみに組み込み関数のuncurryを用いて add'' = uncurry add' とでも定義すると
add'' :: (Int, Int) -> Int
というおそらく>>698 でイメージしているであろうものに近い関数が得られる
Haskellのデフォルトの振る舞いはこちらではないという話
2018/09/04(火) 14:03:08.32ID:TMcC/EnP
通りすがりだけど勉強になった
haskell面白そうだな
2018/09/04(火) 20:06:44.00ID:f+p4hPZb
Haskellちょっといじってると楽しいけどこれで飯食うのは自分には絶対無理という確信がある
2018/09/04(火) 20:32:29.35ID:kOsSso2/
Haskellで食っていきたい
2018/09/04(火) 21:00:34.43ID:jmLwKshs
Haskell丼食いたい
2018/09/05(水) 02:13:16.34ID:sfHxtAx4
市場を作れ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況