関数型プログラミング言語Haskell Part28 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2015/04/10(金) 01:30:32.61ID:KZNYLMbmhaskell.org (公式サイト)
http://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part27
http://peace.2ch.net/test/read.cgi/tech/1420718555/
0446デフォルトの名無しさん
2016/06/06(月) 12:31:09.12ID:EqzbMvnJ0447デフォルトの名無しさん
2016/06/06(月) 20:19:50.08ID:vWa0r7Asつまりコマンド引数から得た文字列は端末のエンコーディング設定と同じ文字コードになっている、
という解釈でよいのですね。
だからリテラル文字列と一緒に処理する時は注意が必要、と。
ところで梨の礫なんて言葉、最近はなかなかお目にかかれません。
おばあちゃんでしょうか。
なんかほっこりした気分になりました、ありがとうございます。
0448デフォルトの名無しさん
2016/06/13(月) 20:25:55.22ID:s5cEFL5Fletter `manyTill` try p
pは数文字食ってから失敗するかもしれないパーザです。これはpが成功しない間 letter を繰り返し食って、最後にpを成功させて、食ったpの部分を除いた文字列を返しますが
除かないで末尾にくっつけたまま返して欲しい場合はどうしますか?
0449デフォルトの名無しさん
2016/06/13(月) 22:43:48.50ID:rcz/H1iF0450デフォルトの名無しさん
2016/06/14(火) 21:28:34.01ID:R0tjr5X3func1 :: Int -> IO (Int, Int)
func1 n = do
let n' = func2 n
return (n, n')
func2 :: Int -> Int
func2 n = n * 2
IO関数の結果を通常の名前に束縛しようとしたら
(v1, v2) = func1 エラーになりました。
IO関数の返値を取り出して通常の変数に束縛して、
通常の関数に引き渡し計算をしたいのですが
その方法をもし知ってましたら教えて下さい。
0451デフォルトの名無しさん
2016/06/14(火) 21:38:10.85ID:Sm/6bUGx0452デフォルトの名無しさん
2016/06/14(火) 22:27:07.09ID:5Tpa+uD8日本語も意図もよくわからんが、そもそも
func1 n = (n, func2 n)
でいいと思うのだが。
0453デフォルトの名無しさん
2016/06/14(火) 22:44:08.85ID:XZG+uE2j俺も意図が分からんが、こういう事か?
func0 = do
(x, y) <- func1
func3 x
func4 y
0454デフォルトの名無しさん
2016/06/14(火) 22:47:22.10ID:XZG+uE2jすまん、質問文につられて引数を忘れてた。
(x, y) <- func じゃなくて (x, y) <- func 1 な。
0455デフォルトの名無しさん
2016/06/15(水) 22:15:27.27ID:vYYf6Ztkどうもありがとうございます。
「unsafePerformIO」や「<-」での
バインド試してみます。
0456デフォルトの名無しさん
2016/06/15(水) 22:30:31.44ID:6m5ApfU90457デフォルトの名無しさん
2016/06/15(水) 23:18:57.29ID:bw2YOmBWpythonなら余裕なんだが
0458デフォルトの名無しさん
2016/06/16(木) 02:04:27.75ID:NRUgKoir「安全性の低いアプリの許可」がウザいけど
0459デフォルトの名無しさん
2016/06/16(木) 17:01:17.73ID:pAcx7t63ありがとう
普通に送れてる人がいるなら
やっぱりこっちの環境が悪いんやな~
0460デフォルトの名無しさん
2016/06/16(木) 22:02:58.55ID:NRUgKoir前バージョンでプルリク入ってたので
バージョンを1.3.2に上げれば大丈夫
0461デフォルトの名無しさん
2016/06/17(金) 11:33:07.28ID:qUa7S6e8smtps-gmailを1.3.1から1.3.2にアップデートしたら解決しました
ありがとうございました
0462デフォルトの名無しさん
2016/06/19(日) 09:34:14.61ID:U9gQeIb+ghci上でletするのと違って、hsファイルではletしたらinしないとダメ。
returnの前にin入れるよろし。
0463デフォルトの名無しさん
2016/06/19(日) 10:02:38.64ID:U9gQeIb+func1 n = let
n' = func2 n
func2 n = n * 2 in
return (n, n')
letとか使い慣れてなかったからインデントエラーで手間取った^^;
returnは普通の関数(というか、do n <- getContentsもgetContents >>= n -> の構文糖衣なだけで、普通のモナド専用演算子だが)
0464デフォルトの名無しさん
2016/06/19(日) 10:08:35.36ID:U9gQeIb+>>= n ->は
>>= の後にnを引数に取るラムダ式に訂正ね。
0465デフォルトの名無しさん
2016/06/19(日) 10:16:10.21ID:U9gQeIb+0466デフォルトの名無しさん
2016/06/19(日) 14:09:22.54ID:+Gq0sOtSdoの中のletって、inいらないんじゃなかったっけ?
0467デフォルトの名無しさん
2016/06/19(日) 18:53:19.01ID:pXg+pklT人工知能でしょうか?
有名ソフトには何がありますか?
c#のラムダ式は好きです
0468デフォルトの名無しさん
2016/06/19(日) 19:15:45.51ID:Z3K3Aq0Z速度や低レイヤーを触りたいとかなら他の言語にしとけ
人工知能はpythonとかライブラリの揃ってていいんじゃないだろうか 知らんけど
0469デフォルトの名無しさん
2016/06/19(日) 19:43:39.12ID:KC3RPfxA0470デフォルトの名無しさん
2016/06/19(日) 21:06:24.60ID:XxQWN3nU0471デフォルトの名無しさん
2016/06/20(月) 04:48:23.69ID:SIt1WX2PC++では普通に使うのに未定義になる
0472デフォルトの名無しさん
2016/06/21(火) 12:29:55.40ID:/zCyXUk+デフォルトの振舞いを批判する暇があったら対案を出せ
0473デフォルトの名無しさん
2016/06/23(木) 06:48:52.26ID:Yp4/uj8T0474デフォルトの名無しさん
2016/06/23(木) 18:55:59.49ID:05qDBgT10475デフォルトの名無しさん
2016/06/25(土) 09:42:45.94ID:VirkFiI/add :: Int -> (Int -> Int)
add x y = x + y
今、ハットンの本を読んでいます。
add :: Int -> (Int -> Int)
のほうは意味がよくわかるのですが、
add x y = x + y
この表記法のがしっくりしません。
add : Z -> {f | f は Z から Z への写像}
add : x -> (f : Z ∋ y -> x + y ∈ Z)
なので、
(add(x))(y) = x + y
となるという意味かと思います。
0476デフォルトの名無しさん
2016/06/25(土) 09:48:52.83ID:VirkFiI/ありません。
引数は1つしか取らないということでいいのでしょうか?
たとえば、
f x = ...
と書いた場合、
「=」は写像の対応を表す記号で、
x -> ...
という意味なのでしょうか?
0477デフォルトの名無しさん
2016/06/25(土) 09:53:44.96ID:VirkFiI/という表記法は普通の関数の表記法とは全く異なるかりー化された関数用
の全く新しい表記法という考えでOKでしょうか?
0478デフォルトの名無しさん
2016/06/25(土) 09:54:40.72ID:mWRDlDK6add x y = x + y
は
add = ¥x -> ( ¥y -> x + y )
の略記( ¥x -> … はラムダ式のリテラル)。
どうしても書きたきゃ1段階だけ略記して
add x = ¥y -> x + y
と書いても構わない(がそう書くのは見たことがない)。
0479デフォルトの名無しさん
2016/06/25(土) 09:58:23.93ID:mWRDlDK6f x
で関数 f を x に適用するという表記が腑に落ちてないのかしら。
関数型言語で関数適用をいちいちf(x)みたいにカッコつけて書いてると煩雑なので
空白それじたいが(左結合の)関数適用演算子であるかのように表記する慣習。
0480デフォルトの名無しさん
2016/06/25(土) 09:59:48.64ID:RoCVjm19f x = h (g x)
f = h . g
がすべて等価だったはず
0481デフォルトの名無しさん
2016/06/25(土) 10:01:20.88ID:VirkFiI/ありがとうございました。略記法なんですね。
add = \x -> ( \y -> x + y )
の正確な意味はまだわかりませんが、こっちのほうは意味がはっきり
わかります。
0482デフォルトの名無しさん
2016/06/25(土) 10:05:25.94ID:mWRDlDK6普通にラムダ式
λx.λy. x+y
のリテラル(表記法)ってだけ。
0483デフォルトの名無しさん
2016/06/25(土) 10:06:47.68ID:VirkFiI/ありがとうございました。
add x y = x + y
ハットンの本を読んでいて、カリー化が出てくるまでは、
関数は一つの引数しか取らないものしか出てきませんでした。
カリー化のところでいきなり x y という表記が出てきたの
でこれは何なのかと混乱してしまいました。タプルに似た
何かの型の要素なのかと思ったり。
略記法ということで納得しました。
ありがとうございました。
0484デフォルトの名無しさん
2016/06/25(土) 10:09:33.66ID:N25pDoND0485デフォルトの名無しさん
2016/06/25(土) 10:11:07.91ID:mWRDlDK6関数適用演算子としての空白は左結合なんで
add x y はカッコを入れてわかりやすく書けば (add x) y のこと。
Haskellの関数はご推察通り一つの引数しか取らない(最初からカリー化されている)。
0486デフォルトの名無しさん
2016/06/26(日) 17:11:33.57ID:gNzZf9B4subtract 1
Intの場合、両者は最適化でも効いて、全く同じコードになってくれますか?
後者は大袈裟なので前者を書きたい
0487デフォルトの名無しさん
2016/06/26(日) 17:20:23.54ID:K7S4TdpPpred = toEnum . (subtract 1) . fromEnum
あとは自分で考えろ
0488デフォルトの名無しさん
2016/06/26(日) 18:22:42.21ID:gNzZf9B4id . subtract 1 . id
と
subtruct 1
では素人考えでは後者の方が速いように思えますが、もしかすると上が下に変換されるかも知れないので判んないです><
0489デフォルトの名無しさん
2016/06/26(日) 18:56:11.33ID:fbaRfY1Tfoldr :: (a -> b -> b) -> b -> [a] -> b
以下では間違いなのでしょうか?
foldr :: (a -> a -> a) -> a -> [a] -> a
0490デフォルトの名無しさん
2016/06/26(日) 18:58:18.40ID:fbaRfY1Tproduct = foldr (*) 1
などを考えると下でもいいような気がするんですが。
0491デフォルトの名無しさん
2016/06/26(日) 19:18:28.21ID:K7S4TdpP(:) :: a -> [a] -> [a]
みたいな関数をfoldrに渡せなくなるだろ
foldr で map 書こうとしてみればわかるよ
0492デフォルトの名無しさん
2016/06/26(日) 19:23:57.64ID:gNzZf9B4二項演算が同じ型同士限定である必然性に乏しいから
0493デフォルトの名無しさん
2016/06/29(水) 07:04:16.86ID:r25iBQLU確信がないのに偉そうなことを言ってると必然的に反感を買う
無神論が許されないという必然性
0494デフォルトの名無しさん
2016/06/29(水) 08:38:27.16ID:3aYMqn0k0495デフォルトの名無しさん
2016/06/30(木) 03:18:46.20ID:u1Y0HI53<???> :: Int -> String -> String
3 <???> hello = "???hellohellohello???"
foldr <???> hello [2,2,3] = "???hellohellohello??????hellohellohello??????hellohellohello??????hellohellohello???"
適当に考えてみた 間違ってたらごめん
0496デフォルトの名無しさん
2016/06/30(木) 07:09:20.44ID:MCZcDeJz[a] -> (a -> b -> b) -> b -> b
Monoid m => [a] -> (a -> m) -> m
二項演算である必要がなかったので単項演算にする例です
0497デフォルトの名無しさん
2016/07/02(土) 11:46:36.27ID:dEZ6Zi3tdo記法が使えるから嬉しいってこと?
0498デフォルトの名無しさん
2016/07/02(土) 15:29:55.10ID:1toMA/Of0499デフォルトの名無しさん
2016/07/02(土) 15:30:33.06ID:Dac+6Yzz0500デフォルトの名無しさん
2016/07/02(土) 15:38:59.47ID:RwQxrqCZ0501デフォルトの名無しさん
2016/07/02(土) 20:47:59.70ID:M4B9OnE7演算中、今何の話してんの?ってことをはっきりさせて余計なこと話そうとする奴を黙らせる
うっかり余計なこと話して脱線しないようにするシステム
ADHD矯正システム
0502デフォルトの名無しさん
2016/07/03(日) 00:10:37.95ID:g/2Vj7Klバズワードを回避してまともな言葉が使えたらそれだけで嬉しい
0503デフォルトの名無しさん
2016/07/03(日) 00:22:39.53ID:q98BxS4G0504デフォルトの名無しさん
2016/07/03(日) 09:19:10.68ID:EfkUt+foこんな f って小さく書けますかね?
0505デフォルトの名無しさん
2016/07/03(日) 09:44:07.94ID:33tWiWdTwhere
f' c (xs,[]) = [xs++[c]]
f' c (xs,y:ys) = (xs++(c:y:ys)): f' c (xs++[y],ys)
これが小さいか大きいかは知らん
0506デフォルトの名無しさん
2016/07/03(日) 09:55:09.62ID:kAyTm6a5f :: a -> [a] -> [[a]]
f v xs = zipWith ((++) . (++ [v])) (inits xs) (tails xs)
ただし f '@' "" = ["@"] となるが、これが望んだ結果なのかは知らん。
0507デフォルトの名無しさん
2016/07/03(日) 09:57:26.96ID:33tWiWdTwhere
splits acc c xs [] = reverse $ (reverse (c:xs)):acc
splits acc c xs (y:ys) = splits ((reverse (c:xs)++(y:ys)):acc) c (y:xs) ys
main = print $ f '@' "abcde"
末尾再帰にしたった
0508デフォルトの名無しさん
2016/07/05(火) 23:11:56.42ID:teB4RGPK0509デフォルトの名無しさん
2016/07/05(火) 23:26:50.28ID:sg2Iayfh0510デフォルトの名無しさん
2016/07/06(水) 01:01:04.59ID:SGI4C5kxなぜ統一できんかったんや
0511デフォルトの名無しさん
2016/07/06(水) 03:35:43.05ID:3LtpfHJl0512508
2016/07/06(水) 09:07:58.46ID:e+6hT/7h0513デフォルトの名無しさん
2016/07/06(水) 11:03:34.97ID:3LtpfHJlhttp://ideone.com/IXEJ23
各行にそれぞれ複数の数字が書かれたデータを標準入力から読み取って
全部の行の合計を出力する例
0514508
2016/07/07(木) 00:39:56.05ID:3l/TdPIoありがとうございます。
メソッドチェーン専用の関数みたいなものは無いんですね。
d3.selectAll("p").style("color", "white");
のようにメソッドチェーンの途中で引数を取る関数がある場合はHaskellではどう書くのでしょうか?
0515デフォルトの名無しさん
2016/07/07(木) 07:24:10.29ID:2aQfBH7H二項演算なら無駄な括弧がなくなることは客観的にわかるが
0516デフォルトの名無しさん
2016/07/07(木) 07:35:43.00ID:LeKCeFlKd3 & selectAll “p” & style “color” “white”
他の言語で T1.method(T2,T3) (返値はR)みたいに書くものはHaskellだと
method :: T2 -> T3 -> T1 -> R という型を持つ普通の(カリー化)関数として書いて
関数適用や関数合成を連鎖させて書く
あと関数適用や関数合成は数学同様に右から左に連鎖させて書くのが普通で、
いわゆるメソッドチェーンのように左から右には書かない(モナドを除く)
>>513のようなものは
getContents >>= print.sum.map read.concat.map words.lines
が普通の書き方
0517デフォルトの名無しさん
2016/07/07(木) 07:45:28.85ID:LeKCeFlKどうしてもやりたければライブラリでなんとかするのがHaskellでの普通の発想で、
実際に(関数合成演算子のドットを数学的からくりを駆使してメソッドチェーンの
ドットとして読めるようにしてしまうことで)それをしてるのが Lens パッケージ
0518デフォルトの名無しさん
2016/07/08(金) 07:50:05.57ID:HHTq9Yfv僕はアルゴリズムに、再帰呼び出しによるマージソートを選択しました
solve::Int -> [Int]
solve j = (1 `tbl` j):(merge (map (`tbl` j) [2..]) $ solve (j+1))
tbl i j = i*(j+1)^3
(mainとmergeは本質でないので省略)このルーチンでのぞんだ所、答えは正しいのですが大きなmに対してMLEでした。原因はリストを使ってるせいで、評価済みの要素はもう不要にも関わらず保持し続けてしまっているせいだと思い、
sweep (a,b) c = (b,c) という関数を作り、
foldl' sweep (undefined,undefined) $ take (m+1) $ solve 1
することで最後の2つの要素のペア(求める値とその次の値)を得て、途中になぞっていったリストの要素はガベッジコレクション可能になると期待しました。
結果、前回より二つテストを前進しましたがそこでやはりMLEでした。次の一手を教えてください
0519デフォルトの名無しさん
2016/07/08(金) 08:51:31.05ID:6Zixlsju0520デフォルトの名無しさん
2016/07/08(金) 09:38:40.02ID:HHTq9Yfv0521デフォルトの名無しさん
2016/07/09(土) 10:23:30.04ID:6VbJAOZW0522デフォルトの名無しさん
2016/07/11(月) 08:51:48.39ID:/+kUKYFrconst 'A' 'B'
->'A'
で
const 'A' undefined
->'A'
となりますが、例えば
const <$> Just 'A' <*> undefined
->*** Exception: Prelude.undefined
となります。この結果の違いが生じる理由は何なのでしょうか
0523デフォルトの名無しさん
2016/07/11(月) 11:19:44.46ID:f8mQHfL+0524デフォルトの名無しさん
2016/07/11(月) 18:34:09.29ID:AjHPC2UO値を取り出して処理しようとする時点で例外を投げてる
<*> の第1数のモナドに包まれた関数が const だろうがなんだろうが
その関数の評価の前に<*> の第2引数の評価が生じるのでそうなる
0525デフォルトの名無しさん
2016/07/11(月) 18:42:28.43ID:AjHPC2UO多相性を端折ってMaybeに特化して敢えて再発明すると
<*> :: Maybe (a->b) -> Maybe a -> Maybe b
mf <*> mv = case (mf,mv) of
(Just f, Just v) -> Just (f v)
(Nothing, _) -> Nothing
(_, Nothing) -> Nothing
みたいになってて、undefined 値をパターンマッチしようとして例外投げてる(たぶん)
0526デフォルトの名無しさん
2016/07/12(火) 12:41:57.06ID:eYeWW2L80527デフォルトの名無しさん
2016/07/20(水) 10:25:34.27ID:VWk1kGFj>モナドは文脈
>>503
>ただのプログラム可能なセミコロンだろ
そんなのでモナドが分かるわけないだろ
自分でも分かってないだろ
そもそも受け売りじゃなく自分の言葉で言え
0528デフォルトの名無しさん
2016/07/20(水) 10:38:06.92ID:oWJ56nOjモナド則を満たせば何であれそれはモナドだし、それ以外に説明する言葉などない。
それがどのように便利なのかということと、モナドが何者であるかを混同するのはよくない。
0529デフォルトの名無しさん
2016/07/20(水) 11:46:05.72ID:VWk1kGFj誰に対して言ってるのか分からんが、
あんたは501,503にも及ばない単なる機械か石ころだな
定義を読んでるだけで、定義を理解したり、定義を作ったりしたことがないだろ
0530デフォルトの名無しさん
2016/07/20(水) 16:40:29.10ID:HQM16vFtモナドクラスとモナド則と数学は後で勉強しろ
この順序を間違えなければ理解できると思う
0531デフォルトの名無しさん
2016/07/21(木) 11:25:19.65ID:jJzdCE8w抽象化や情報隠蔽は時代に逆行している
0532デフォルトの名無しさん
2016/07/23(土) 05:36:08.80ID:zdmgkc+M0533デフォルトの名無しさん
2016/07/25(月) 12:51:34.33ID:IZp+OdY9build-depends に列挙されたパッケージが未インストールなら自動手にインストールされますが、
このとき、コマンドのオプションとして --haddock オプションを付ければライブラリドキュメントも構築されます。
わたしの場合は、パッケージのインストールの際はいつでもドキュメントも作られてほしいのですが、
毎回このオプションをつけるのは煩わしいです。
stack ではなく cabal だけでインストールやビルドしていたときは、
$HOME/.cabal/config ファイルの documentation を True にしておけば動的にドキュメントが作られました。
stack でも同じように自動的にドキュメントが作られるようにするにはどうすれば良いでしょうか。
0534デフォルトの名無しさん
2016/07/25(月) 15:07:37.73ID:0y8CzYDsに
build:
haddock: true
でできるように(我らがヒーロー)chrisdoneさんがしてくれたみたい。
0535デフォルトの名無しさん
2016/07/25(月) 20:43:22.58ID:IZp+OdY9ありがとうございます。
できました。
ところで、HsColour へのパスを通し忘れていたみたいで、
インストールされたライブラリドキュメントの各関数にソースへのリンクが張られていません。
stack でドキュメントを強制的に上書きで再インストールする方法はあるでしょうか。
0536デフォルトの名無しさん
2016/07/25(月) 22:52:02.75ID:0y8CzYDs調べたけど簡単な方法はわかんなかった。手で削除して一つ一つをリビルドするしかないのかも。
イマイチ自信がないから注意してほしいんだけど、例えばこんな風にやります...
まず、ドキュメントのインストール先を調べる。
$ stack path | grep "doc"
snapshot-doc-root: /path/to/snapshot/doc
local-doc-root: /path/to/local/doc
二つのディレクトリのどっちかに入ってるかわかったら、
例えばsnapshotの方なら、そのディレクトリの中身を削除する。
$ rm -rf `stack path --snapshot-doc-root`/*
その後でhaddockを再構築する。
$ stack exec -- ghc-pkg list --package-db=`stack path --snapshot-pkg-db` --simple-output | xargs -n 1 stack haddock
0537デフォルトの名無しさん
2016/07/27(水) 18:59:54.20ID:p304Zd6v念のためバックアップをとってから試しましたが、うまくできました。
今のところ特に問題は見つかっていません。
ありがとうございました。
0538デフォルトの名無しさん
2016/07/29(金) 23:39:42.61ID:MRKaDYWCHaskell Platform 2014.2.0.0で標準ライブラリだったのですが。
equal, new, unsafeWrite, run が使えなくて困っています
0539デフォルトの名無しさん
2016/07/30(土) 00:41:53.51ID:FdhqaNGktextパッケージの中にありますよ
https://hackage.haskell.org/package/text-1.2.2.1/docs/Data-Text-Array.html
0540デフォルトの名無しさん
2016/07/30(土) 01:08:24.92ID:e3eNfr/70541デフォルトの名無しさん
2016/08/06(土) 13:44:41.15ID:AFiBfwTx0542デフォルトの名無しさん
2016/08/10(水) 20:45:06.76ID:8Ulk+XDXこれか。日銀は9月会合のドラフトを作成しており、「総括」でも2%のインフレ目標は維持と。
ttp://www.reuters.com/article/us-japan-economy-boj-idUSKCN10L13A
0543デフォルトの名無しさん
2016/08/11(木) 18:25:10.90ID:3hGYSwfG0544デフォルトの名無しさん
2016/08/12(金) 00:39:34.68ID:XbNuNDlJ競プロでHaskell使う場合、競プロだとソースコード1ファイル提出が多いから
ソースコード内にBase Packageのライセンサーの名前を付記しておけばおk?
base: Basic libraries
http://hackage.haskell.org/package/base-4.9.0.0
http://hackage.haskell.org/package/base-4.9.0.0/src/LICENSE
0545デフォルトの名無しさん
2016/08/12(金) 00:43:24.62ID:XbNuNDlJ■ このスレッドは過去ログ倉庫に格納されています