関数型プログラミング言語Haskell Part30 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/01/15(日) 23:43:54.28ID:Vh4eztBk
関数型プログラミング言語 Haskell について語るスレです。

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

前スレ
関数型プログラミング言語Haskell Part28
http://echo.2ch.net/test/read.cgi/tech/1428597032/
639デフォルトの名無しさん
垢版 |
2017/06/12(月) 00:18:12.16ID:9+UoMkQw
テンプレート?
2017/06/12(月) 01:00:35.16ID:p/7lEol5
fを適用した結果の型が外側のリストの型と合わないってことでら
2017/06/12(月) 01:38:16.98ID:0O7XnA5J
たぶんshowの結果を評価する途中でunsafePerformIOすればいいんだな
2017/06/12(月) 01:46:50.84ID:4tiz7p+p
[ “aa”, “bb”, [“cc”,”dd”] ]

の型がどうやって合うと思ったのだろうか。
2017/06/12(月) 02:20:04.97ID:DHBWzfrJ
邪悪なことはするな
644デフォルトの名無しさん
垢版 |
2017/06/12(月) 02:47:23.94ID:q+c9m0UT
>>638
文字列型の中に文字列のリスト受け取って文字列を返す関数型が混じってる。
2017/06/12(月) 09:44:54.21ID:4tNZZp5I
>>644

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

>>642

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

じゃないの?
2017/06/12(月) 09:53:23.55ID:4tNZZp5I
>>642
自己解決しますたw nilをきちんと入れてなかったみたい。
647デフォルトの名無しさん
垢版 |
2017/06/12(月) 17:07:14.08ID:uTHinYqc
>>645
関数自体も値なのだが。。。
仮に返り値だとしても、文字列のリストにさらに文字列のリストが入ってるので型が合わない。

["a","b",["c","d"]]
="a":"b":["c","d"]:[] --["c","d"]が一つの値なので、文字列じゃない!!とエラーになる。
2017/06/12(月) 17:22:26.96ID:pxvA8Fxv
なんでここでnilの話になるんですか?
2017/06/12(月) 18:54:07.23ID:rXVGv3m5
どうしてもできないときは、それはする価値がないのだ

= 何かをしたくて、その手段としてそれをしようとしているが、実は何かはそれでなく別の方法でより自然に実現できることが多い。無理矢理その手段を開発する価値が本当にあるのか、もう一度考えてみよう
2017/06/12(月) 20:01:13.71ID:4tiz7p+p
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"]]
2017/06/12(月) 21:30:08.56ID:4tNZZp5I
>>647
> ["a","b",["c","d"]]
> = "a":"b":["c","d"]:[] --["c","d"]が一つの値なので、文字列じゃない!!とエラーになる。

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

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

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

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

それだけではその評価が本当に正しいかどうかが分からない
2017/06/12(月) 22:36:06.43ID:ejDn/VSN
>>651
> 文字列または文字列のリストからなるリストというのはあり得るでしょう?

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

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


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

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


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

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

>>650 が言っているのはきっと、GHCi で試してみれば「構文エラーであることが分かる」、
ということだと思いますよ。
それが正しいのか分からないというのは、GHC は信用できないということですか。
2017/06/12(月) 22:39:18.30ID:4tiz7p+p
>>651

https://paiza.io/projects/TpKm5_4fBEc7_YoKQIeKJQ

こういうのがお望み?
いずれにせよ List のデータコンストラクタ(:)を持ち出した >>633 は救済できんが。
2017/06/12(月) 22:48:23.36ID:cqbaGfvU
もしかして本当に欲しかったもの:
[["aa"], ["bb"], ["cc", "dd"]]
2017/06/12(月) 22:49:39.74ID:4tiz7p+p
https://paiza.io/projects/4geVOsfwAnMedzLfkbEDpw

こっちのほうがパラメータ多相でいいか。
2017/06/12(月) 22:58:41.14ID:4tiz7p+p
ちなみに、自分自身を要素の型とするかのような「ネストしたリスト」のようなデータ構造(というかinfnite typeのまがいもの)自体はときどき使いたくなるので簡単なライブラリを書いたことはある。そういやOCamlは オプショナルだが infnite type 扱えるんだったっけ??
2017/06/12(月) 23:23:51.05ID:4tNZZp5I
>>652
> なぜなら、Haskell には「型A または 型B」という型は存在しないからです。

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

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

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

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

さっきも言ったが、「今そうなってる」というのは 「正しい」とは異なる
2017/06/12(月) 23:32:25.99
方法が存在しないことの証明って悪魔の証明でないの?
できると主張する側ができることを証明しないとダメだよ

痴漢の言いがかりをつけられて、『痴漢していないことを証明しない限り有罪な』って裁判官に言われて納得できる?
2017/06/12(月) 23:39:48.75ID:4tiz7p+p
>>657はできるという根拠をコードで示せばいい。

Haskell 2010 に従ったコードで、しかしGHCが不当にも
型検査で排除するというような、そういうコードを示せば
話はたちまちに解決する
2017/06/12(月) 23:42:32.96ID:4tiz7p+p
[“aa”, [“bb”,”cc”]]

について Haskell2010 の構文規則をを充足するような
Haskellの型をつけてくれればいい
2017/06/12(月) 23:43:46.21ID:ejDn/VSN
>>657
みんな、特に断りがなければ今のHaskellについて質問したり語ったりしています。

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

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

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


>>658
方法の存在を仮定した場合に矛盾がおきることを示すことで、方法の非存在を示すやり方もあります。
数学(厳密な論理)の舞台に上げられるテーマであれば友好的な手です。
(面倒かどうかは別にして)
2017/06/12(月) 23:48:33.05ID:ejDn/VSN
>>661
うぁ、恥ずかしい、友好的な手って何だよ。

有効な手、ね。


>>659
彼、今のHaskellには興味ないそうですよ。
2017/06/12(月) 23:48:35.55ID:PpCA4OTT
定義の証明をしろってことか
1の次の数は2であることを証明しろ的な
つまり1=2は間違いとは言えないのだ
2017/06/12(月) 23:59:06.10ID:4tiz7p+p
>>663
>1の次の数は2であることを証明しろ的な
>つまり1=2は間違いとは言えないのだ

Succ 1 = 2 とか普通にPAで証明できるけど……
2017/06/13(火) 00:09:20.22ID:kWBme6H8
本来のHaskellってなんですか
666デフォルトの名無しさん
垢版 |
2017/06/13(火) 00:57:22.00ID:12SNvyK/
LISPベースのリスト
667デフォルトの名無しさん
垢版 |
2017/06/13(火) 11:30:18.72ID:OES2L0YQ
>>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"]

じゃあダメなのか?
手段にこだわるより、目的果たす事考えようぜ。
2017/06/13(火) 12:23:55.30ID:JgnP6kSF
>>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"]
>
> じゃあダメなのか?

それではもとの問題と違うし、スマンが興味わかんわ
669デフォルトの名無しさん
垢版 |
2017/06/13(火) 13:10:39.07ID:s+JNd9SI
>>668
将来も今も["a","b","c","d"]は[String]って型で表現できるけど、
["a","b",f ["c","d"]]はどういう型で表現するのさ?
こう表現出来るってのが無いと、ただ単に型に対する意識が低いだけのお馬鹿さんだよ?
670デフォルトの名無しさん
垢版 |
2017/06/13(火) 13:17:22.94ID:s+JNd9SI
大体、複数に型を纏めるんならタプル使えよ。
(["a","b"], f ["c","d"])
fが部分適用してない、値を返す関数なら結果の型が入るし、部分適用で関数としてタプルに入ってるなら何か受け取って何か返す関数の型がタプルにに入る。
2017/06/13(火) 14:08:02.45ID:pIEcxV3Y
nilわすれてるってのはさ、
[a, b, c, d] と a : b : c : d : [] が等価ってことでさ、
この末尾の:[]を忘れたらあかんってことじゃないの?
2017/06/13(火) 14:26:42.82ID:JgnP6kSF
>>669
そこのfはどういう関数型という想定?
2017/06/13(火) 15:33:15.95ID:kWBme6H8
自分の間違いを認められず引くに引けなくなってるだけなんじゃないの
674デフォルトの名無しさん
垢版 |
2017/06/13(火) 18:11:35.28ID:XoC5HvTL
>>672
>>668に聞いてくれ。
そもそもどんな型でも文字列が返ってくる以外は入れられない。

f = concat

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

こう言うの以外は現行で受付られないが、それ打破するリストの型表現が存在出来るなら、将来実装されるかもな。
2017/06/13(火) 18:19:50.97ID:pvAx0DQv
fは引数でもない外側のリストを無理やり拡張するのか……おぞましいな
そんな実装されたらHaskell見限るわ
676デフォルトの名無しさん
垢版 |
2017/06/13(火) 18:35:46.29ID:XoC5HvTL
だよな。
だからこそmapとかの関数作りやすいのに、そんな変な機能将来に渡って欲しいとは思わん。
入力->出力が素直だからこその関数プログラミングだってのに。
欲しい最終データが手に入れば良いのに、>>668は手段と目的が逆転してんだよ。
2017/06/13(火) 19:30:15.82
どうしてもそれができないときは、本当にそれが必要不可欠なのか、もう一度よく考えてみよう
2017/06/13(火) 21:22:18.24ID:JgnP6kSF
>>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の不可能性をだれも論証できないのかな?
(要点さえ分かれば簡略でよいが)
2017/06/13(火) 21:34:21.04ID:BDZwTNDo
型は単に「欲しい最終データが手に入ればよい」っていうよりは
ある種の性質がコンパイル時に保証されてるってのがありがたい
エンバグも検出しやすい

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

>>678
> ["aa", "bb", f ["cc", "dd"] ] =
> ["aa", "bb", "cc", "dd"]
これはリテラルでこう書いてる以上、 fがどんな値を返そうと
左辺は要素が3のリストで右辺は要素が4のリストだから
パターンマッチに成功するわけない
2017/06/13(火) 21:39:23.64ID:Qd0f53fz
>>678
ここにいる人たちは俺もあんたも含めて誰も証明できないことは、
いままでの一連のレスですでに分かっているはず。

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

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

頼むから、一般の関数型言語における可能性や証明の議論は大学でもっと頭のいいヤツらとしてくれ。
2017/06/13(火) 21:43:22.47ID:RNIsqaqt
中途半端な数学屋なんて全然怖くないのに
数学系と聞いて逃げるHaskellプログラマ大杉
2017/06/13(火) 23:14:18.88ID:qhE8awpR
とりあえずこんなもんでどう?
https://ideone.com/wMOghJ
2017/06/13(火) 23:32:43.89ID:qhE8awpR
どうせならFoldableにすりゃよかったな
ま、いっか
2017/06/13(火) 23:59:28.85ID:pYqK9vAB
Haskell の枠組みにとらわれないなら、自分専用関数型言語の
文字列リテラルを 682 が示した Nest みたいに自由に定義すればいいもんな

これで解決だ
2017/06/14(水) 00:01:03.56ID:ZT/uD64c
ideoneやpaiza.ioのようにhaskellコードのコンパイルと実行を同時にしてくれるようなローカルアプリはありますか?
補完とかはなくてもいいですし、exeも生成しなくていいのですが
2017/06/14(水) 00:24:00.03ID:VydZF3sS
["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は存在し得ない。

本当は、型なしラムダ計算に落としこんでからやる必要があるけど、
(型なしラムダ計算にチャーチ・ロッサー性があることは証明済み)
骨子としてはこんな感じ。
687デフォルトの名無しさん
垢版 |
2017/06/14(水) 00:35:10.46ID:Ei72hKB9
要するにLispのマクロの ,@ みたいな展開をしたいってことか?
2017/06/14(水) 02:36:17.24ID:jR7LtVt0
>> 683

まあ、こういうデータ構造なんか既視感あるよなと思ったら、リストじゃなくてツリーだよね
つうか Data.Tree がまんまそれ
2017/06/14(水) 05:34:36.84
>>681

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

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

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

ではなく、

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

の様な単一の値としてしか返りようがないって分かるだろ。
あれか、複数の値を返せってか。
従来の値が欲しい方はどうすんだよ。
2017/06/14(水) 09:53:35.84ID:dwFQOh88
>>679
> 他の言語だと[Any] なListがあったりするけど(例えばScala)
> よくあんなの使うなーって思う
その例は極端すぎる。Anyは論外。型の否定と同じ。(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が存在しないことは、
> チャーチ・ロッサー性で説明できる。
折角だが今の件はチャーチ・ロッサー性(合流性)は関係ないと思う。
合流性以前の到達性が問題なので。
2017/06/18(日) 12:36:58.87ID:P8yIezdD
配列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]]
となるような関数です
2017/06/18(日) 12:50:16.34ID:aJwV86NO
>>692
hoogle で調べてみても、それっぽいものが見当たりませんね。
少なくとも標準ライブラリにはありません。
なので、その定義に自分で適当に名前を付けて使ってください。
2017/06/18(日) 12:56:47.67ID:P8yIezdD
>>693
ありがとうございます
ないならないで問題ありません
たまに使うのですが、既にあるならわざわざ定義するのも無駄だなと思っただけなので
2017/06/18(日) 15:28:29.26ID:sgvQsVTs
>>692

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

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

g <$> xs <*> ys

がその答え。
696デフォルトの名無しさん
垢版 |
2017/06/18(日) 17:41:11.73ID:VE2N9ory
>>692
zipWithに配列の配列渡せば行けるか?と書いてみた。

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

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

f g xs ys = [map (g x) ys | x <- xs]
697デフォルトの名無しさん
垢版 |
2017/06/18(日) 17:41:54.37ID:VE2N9ory
x配列の配列
oリストのリスト
2017/06/18(日) 22:40:07.66ID:3urB1Yg8
これで行けるよ。
f x = fmap . (. (:[])) . liftA2 x
f (+) [1,2,3] [4,5,6]
[[5,6,7],[6,7,8],[7,8,9]]
2017/06/19(月) 05:32:16.99ID:DP5W49kg
そういう関数ってすでにある?って質問なのにオレオレ実装載せてく人たち…
2017/06/19(月) 06:40:21.02ID:iu3OXdki
しかも、質問者の実装が一番素直で分かりやすい
2017/06/19(月) 07:45:05.62ID:f7LtpRLv
隙あらば実装

いや、プログラム板ではそれでいいんじゃないか。
2017/06/19(月) 10:22:09.65ID:Gx/WCs0N
組み込みの関数でラムダ式を隠蔽してしまうことには意味があるんじゃないか

ところで質問者の例だと結果が可換なのでそうじゃない例の方が良かったのでは
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]]
とか
2017/06/19(月) 10:46:07.27ID:6iW/OLTz
>>702
それならば、あなたはどのような意味を見いだしたのかまでちゃんと言わないと。
何にどのような意味を見いだすかは人それぞれですし。

私は、ソースは人間が読みやすい事に最大の意味を見いだします。
なので、計算結果を容易に想像できるという点で、
>>692 や >> 696 の下の定義は好きですね。
2017/07/01(土) 02:37:46.49ID:JHLae2yG
IOモナドは命令書という喩えが一番しっくり来た
705デフォルトの名無しさん
垢版 |
2017/07/01(土) 08:12:10.07ID:yvgbUlYU
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はそう考えればまあ自然なんだが、リターンってよりレシーブって印象。
706デフォルトの名無しさん
垢版 |
2017/07/01(土) 09:35:49.67ID:yvgbUlYU
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 ()が返ってると分かる。
2017/07/01(土) 10:27:56.55ID:8Dk+ywm5
IOと純粋関数の関係がどうしても理解できなかったけどwiki読んだらやっとわかったからオススメ
https://wiki.haskell.org/IO_inside
2017/07/03(月) 20:20:17.13ID:n7+jlCYi
stack使ってるのですが、openFileでカレントディレクトリ以外のファイルを指定って出来ないんですかね?
709デフォルトの名無しさん
垢版 |
2017/07/03(月) 20:31:50.76ID:UwBLUxpl
stack関係あったっけ?
何となく¥を¥¥ってしてないだけじゃないかと予想。
2017/07/08(土) 21:56:26.43ID:A29giBA8
タプル作ろうと思ってHoogleで
f :: a -> b -> (a, b)
f a b = (a, b)
となるような関数探したら見つからないんだけどもしかしてない?
割と使いそうなイメージなんだけど
2017/07/08(土) 22:11:48.22ID:TJZt+GMQ
どういうときに使いたいのさ
curry/uncurry ならたまに使うけど
2017/07/08(土) 22:18:49.21ID:ZOCy/rmL
これで
https://wandbox.org/permlink/bSFTBbmr9cQGguSw
2017/07/08(土) 22:48:00.26ID:Tq0FsZsH
>>710
タプルコンストラクタ

$ ghci
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Prelude> :t ((,))
((,)) :: a -> b -> (a, b)
2017/07/08(土) 22:53:26.22ID:AXnSyqoB
>>713
おお、まさにこれです
ありがとうございます
715デフォルトの名無しさん
垢版 |
2017/07/10(月) 01:15:03.97ID:IPU+pjhL
すみません traceデバッグについてですが
ある変数に色とかで印を付けて
IOとは別の専用簡易コンソールに出力表示とか
簡単に出来ない物でしょうか。
2017/07/15(土) 19:13:14.12ID:bXz+G42e
GHC 8.2 で実装予定の backpack なるものが一体
現在のどのような問題をどのように解決することを目指したものか、
分かる方いますか?

どうも、モジュールシステムの拡張みたいですが...
717デフォルトの名無しさん
垢版 |
2017/07/17(月) 23:01:46.61ID:4tJqH+Y+
ご冥福
2017/07/18(火) 03:45:58.72ID:6+yJKiYC
すぐりって読むのだと思ってました
719デフォルトの名無しさん
垢版 |
2017/07/19(水) 22:41:31.74ID:BqP8obNe
https://twitter.com/tanakh/status/886624071005294592

これ?
2017/07/21(金) 21:39:30.54ID:kkMUVecO
文字列のリストがあって、それぞれの要素を順番にputStrLnするだけならmapM_よりtraverse_の方がいいですか?
2017/07/22(土) 10:13:22.40ID:/BTLbKbr
Haskellerなんですぐ死んでしまうん
2017/07/22(土) 11:57:08.36ID:/9K4Ed3n
えぇ・・・
2017/07/22(土) 14:53:16.39ID:4NLvcjES
必要以上に多相にしたり制約を弱めるのは典型的な bad practice
concat のかわりに join 使ったりしないでしょ
2017/07/22(土) 14:54:33.27ID:4NLvcjES
ライブラリコード書くときには可能な限り型クラス制約を弱めて多相に
利用するコードではむしろ反対に
2017/07/22(土) 17:58:06.65ID:1dVz8HPB
>>723
つまりtraverse_の方がいいって認識でいいですか?
2017/07/22(土) 19:58:53.32ID:AuEOuo+E
Haskellerはマジでメンヘラが多い
2017/07/22(土) 22:29:16.45ID:wIG0mEjF
パフォーマンスモニターを提供する ekg というライブラリがあるんだが、
これ、なかなか凄いな。

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


ちなみに、俺はこのライブラリの存在をここで知った。
http://www.stephendiehl.com/posts/production.html
このブログポストに商業アプリ制作にHaskellを使う際の心得みたいなことが書かれていて、
Performance and Monitoring の項で ekg が紹介されている。
このブログの他のポストもなかなか面白いから暇人は読んでみるといいよ。
2017/07/23(日) 00:17:34.21ID:m+ryfkmk
>>725
ちょい待ち >>723>>724 のアドバイスに従うなら、そこは mapM_ でしょ
2017/07/24(月) 20:13:14.08ID:Rqhmx9U8
他の言語の書き方が良くなると聞いて始めてみたが、難しい・・・
というか今のとこ恩恵が分かんない^^;
2017/07/24(月) 20:20:07.13ID:RBhDn3mI
他言語の書き方は俺は良くなったな
2017/07/24(月) 21:03:53.98ID:h3biSAhr
過去何度か似たような質問や意見が出てるが、
今までこういう書き方だったのがHaskellのお陰でこう改善された、
という具体例が挙がった試しがない。
改善例が載っているブログなどの紹介すらない。

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

それができないと言う事は、きっと違いが説明できないほど微妙で曖昧な変化を
改善と言っているのだろう。
2017/07/24(月) 21:22:17.61ID:emVJufwa
いやそんなの最初からちゃんとやれよと思うかもしれんが非関数型の言語を触っているときに比べて入出力をはっきりと意識するようにはなった
特に動的型付けだと何も考えなくても動くだけのものは作れてしまうからな
2017/07/24(月) 21:27:21.43ID:jM5xaigZ
大リーグ養成ギブスはめられてるような気持ち
2017/07/24(月) 21:56:08.66ID:RBhDn3mI
>>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   ヾ 丶
     "~、ソ:: :い:: :     \_  ノ ,    ヾ 丶
2017/07/24(月) 22:18:09.60ID:Dtg+FNV7
俺は大幅に改善されたので満足です
2017/07/24(月) 22:30:09.86ID:DrMH5w+T
はすける始めたら彼女とセフレが出来ました!
2017/07/25(火) 00:51:32.66ID:oURyYS1P
デザインパターンのようなものが自然に学べる(要出典)

>>732
IOモナドを学んでしまうとvoidとかなんやねん!て気持ちになる
2017/07/25(火) 02:18:19.45ID:kRJD7bjt
IO () ← なんやねん!
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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