関数型プログラミング言語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/
0153デフォルトの名無しさん
2016/03/07(月) 18:16:32.36ID:uqmql4P/0154デフォルトの名無しさん
2016/03/11(金) 22:48:50.97ID:lf/FOxiD導入というのがインストールではなくプログラミングのことなら、
書籍「Developing Web Applications With Haskell and Yesod」がおすすめ。
既にHaskellの基礎が分かってるなら、Chapter3 の冒頭の Hello, World から
手を動かしながら読んでいけばWebアプリの作り方が分かるようになるよ。
英語だけど、殆どのところは平易な言い回したがら、和訳しようなんて思わなければ、
高校生でも意味は読みとれると思う。
(今となっては一部内容が古いかも。MozillaのBrowserIDの例があったり)
0155デフォルトの名無しさん
2016/03/11(金) 23:14:09.63ID:3/HLXc0f0156152
2016/03/16(水) 19:43:32.46ID:5Au1FueU遅レス(´・ω・)スマソですが、ありがとうございます
その本英語でちょっと古いという話があるから、
どうしようか迷ってたけどやってみますかね
0157デフォルトの名無しさん
2016/03/17(木) 23:13:15.15ID:Opt/41wo1:2:[]と[1,2]が一緒で構文糖衣というてな
0158デフォルトの名無しさん
2016/03/18(金) 05:09:50.52ID:bw5Y7I/70159デフォルトの名無しさん
2016/03/18(金) 16:35:22.98ID:SKNZeuAp0160デフォルトの名無しさん
2016/03/19(土) 17:34:27.78ID:W8OFmztnhttps://en.wikipedia.org/wiki/Haskell_%28programming_language%29
0161デフォルトの名無しさん
2016/03/19(土) 17:47:08.94ID:SYQTFOu+0162デフォルトの名無しさん
2016/03/19(土) 17:49:00.51ID:EuGwJiBL0163デフォルトの名無しさん
2016/03/19(土) 18:00:05.02ID:2lKXEDYi0164デフォルトの名無しさん
2016/03/20(日) 00:11:31.81ID:wXobkPts0165デフォルトの名無しさん
2016/03/20(日) 00:31:55.66ID:GdGOCP5U遺伝的アルゴリズムや正規表現とのテキスト処理しようかと思ってるんだけども
0166デフォルトの名無しさん
2016/03/20(日) 00:46:35.50ID:75/94Ydr「堅すぎて」の意味もよくわからんが、
それが「実用に向くか」となんの関係があるんだ
0167デフォルトの名無しさん
2016/03/20(日) 01:06:04.26ID:GdGOCP5U今の所cでcgiを書くかのような凡雑さやくどさを感じてる
リストや配列処理はp系言語より上とは思ったけどその他は面倒そうな印象
ファイル入出力と正規表現でささっと色々出来たら文句ないんだが慣れの問題かね??
0168デフォルトの名無しさん
2016/03/20(日) 01:24:57.01ID:lpAAOCss0169デフォルトの名無しさん
2016/03/20(日) 02:03:43.11ID:RTTkGWUK0170デフォルトの名無しさん
2016/03/20(日) 02:19:41.31ID:GdGOCP5Uまあそう言うな趣味だから用途は理屈付けだからあんま意味ないわ
最低限事が出来るならそれていいべ
今ちなみに今はすごハス読みながらガードを覚えた所
0171デフォルトの名無しさん
2016/03/20(日) 03:49:21.37ID:Q2v2u5ZM0172デフォルトの名無しさん
2016/03/20(日) 05:16:25.92ID:2OeezbvBほんとにちょっとした文字列処理なら正規表現でもいいけど
ある程度の規模ならパーサコンビネータ(Parsecとか)覚えると
可読性やメンテ性、あとHaskell使いこなしてる感が上がって楽しい
ファイルの読み書きはとりあえずwithFile関数覚えておけばいいんじゃないですかね
0173デフォルトの名無しさん
2016/03/20(日) 06:28:19.33ID:yN6fzEfaなぜか使いにくい印象持たれてるのはあるな
ただ慣れないと細かい事に文句言いまくるクソ言語にしか見えないのも確かだ
一定以上慣れてやっと、エンバグの減少と共に恩恵の効き目が見えて来る
0174デフォルトの名無しさん
2016/03/20(日) 06:54:21.91ID:75/94Ydr> 今の所cでcgiを書くかのような凡雑さやくどさを感じてる
それが「実用に向くか」の中身ならまさに「スクリプト言語でも使えば?」としか
CがCGIに向いてないから「実用に向かない」というなら
Haskellも同じように「実用に向かない」んじゃね
…つうか「凡雑さ」ってなに??
0175デフォルトの名無しさん
2016/03/20(日) 06:57:00.83ID:75/94Ydr「ぼん」が「凡」になったのかな(実用向きの推理)
0176デフォルトの名無しさん
2016/03/20(日) 08:50:29.01ID:b1lneXIIってことでしょ
0177デフォルトの名無しさん
2016/03/20(日) 10:12:07.36ID:QzGGeNArHaskellで書いたコード
それぞれ三ヶ月後に見なおして戦意を保てるのはどっち?
0178デフォルトの名無しさん
2016/03/20(日) 10:40:39.85ID:yN6fzEfa当然戦意ならPerlのが保てるだろう
矛先の向く先は別だが
0179デフォルトの名無しさん
2016/03/20(日) 11:05:04.88ID:bCzJEDSh0180デフォルトの名無しさん
2016/03/20(日) 11:23:11.57ID:GdGOCP5U>>177の様なこの辺の感覚がどうも分からんのよなぁ
自分cとperl出来ないけど多分cとperlはやったらやり易いか他と比べて"煩雑"か分かるとは思うんだがhaskellは分からないんだよな
0181デフォルトの名無しさん
2016/03/20(日) 11:40:10.28ID:uW1sojJd普段はほとんど書かないくせにたまに珍しく書いたコードは忘れない
他人のコードも読んで覚えているので自分のコードを忘れても普通に読める
0182デフォルトの名無しさん
2016/03/20(日) 13:41:30.29ID:XXr7OH0e0183デフォルトの名無しさん
2016/03/20(日) 14:18:15.45ID:uW1sojJd0184デフォルトの名無しさん
2016/03/20(日) 19:23:53.48ID:F6EQ+GjV0185デフォルトの名無しさん
2016/03/20(日) 19:49:59.20ID:yN6fzEfaまず任意の引数を取れる
そしてカリー化も部分適用もできる、というかカリー化がデフォ
0186デフォルトの名無しさん
2016/03/20(日) 21:11:55.58ID:uW1sojJd関数 a -> b が2つ以上の引数を取る可能性≒リスト x : xs の長さが2以上になる可能性
0187デフォルトの名無しさん
2016/03/20(日) 21:12:04.55ID:yCyuHG/Eカリー化されているからこそ部分適用が出来る気がするが
2つ以上の引数を同時に与えたければ、tupleなりuncurryを使えばよい
0188デフォルトの名無しさん
2016/03/20(日) 21:24:27.87ID:RHLJPn4C読んでる本にhaskellはデフォで入ってるmaxやらsuccやらの関数は実はカリー化、部分適応されてて全部引数は一つと書いてたけど
逆に一つでしか出来ないという意味だったことにお宅のレスを見て気付いたありがとう
0189デフォルトの名無しさん
2016/03/20(日) 22:15:16.97ID:75/94Ydr○「適用 application」
×「適応 adaptation」
この間違いがなんでこんなに蔓延ってるのか理解に苦しむ
0190デフォルトの名無しさん
2016/03/20(日) 22:50:07.51ID:F6EQ+GjVadd2 x y = x + y
のとき、
(add1 1)も(add2 1)も部分適用ですか?
そもそもHaskellで引数の個数はどうやって決めるんでしょうか。
0191デフォルトの名無しさん
2016/03/20(日) 23:00:39.89ID:GdGOCP5Uあら?haskellに引数の数自体なくて全てカリー化、2個目以降の引数は全て部分適用に回す
、て話じゃなかたの?
0192デフォルトの名無しさん
2016/03/20(日) 23:17:31.21ID:uW1sojJd0193デフォルトの名無しさん
2016/03/20(日) 23:52:47.28ID:75/94Ydradd2のような関数定義はadd1のシンタクス・シュガー
そしてどちらでも引数の個数は常に1だ
add関数が「2引数」の関数だと言いたいときのような
普通の意味での「引数の個数」は、型の中に関数型構築子(->)が
何個あるかを数えれば(少なくとも直感的には)よい
部分適用(に見えるもの)の特殊例――第1引数に対する部分適用――が
カリー化されていることによって容易に記述できるという話であって、
部分適用の実現にカリー化を使う必要があるわけではないし、
第2引数(に見えるもの)に対する部分適用はカリー化とは関係がない
Haskellなら演算子に限っては(* 2)のように、第2引数(に見えるもの)に対する
部分適用の構文があるわけだけども
0194デフォルトの名無しさん
2016/03/20(日) 23:53:27.24ID:rJQ1OYnP引数を一個取って、『引数一個取る関数』を返せば、それをさらにn-1回繰り返してn個の引数を取る関数を実現できるからね
0195デフォルトの名無しさん
2016/03/21(月) 00:12:24.62ID:W47zDOKQ0196デフォルトの名無しさん
2016/03/21(月) 00:20:07.72ID:+Zc9mgUl0197デフォルトの名無しさん
2016/03/21(月) 00:26:29.46ID:mEjk8CaC0198デフォルトの名無しさん
2016/03/21(月) 02:09:27.30ID:mqJW4NLD最初から1引数関数に1引数を渡しているようにしか見えないんだが
0199デフォルトの名無しさん
2016/03/21(月) 02:10:12.72ID:W47zDOKQそれってどの部分に応用できるの?
>>197
ただの部分適用だと思ってても文法は変わらなくない?
0200デフォルトの名無しさん
2016/03/21(月) 08:13:00.45ID:Z1UuXowGそこまで行くと最早言語仕様の話になるような。。
他の言語でいう連想配列あれば配列いらなくね的な
俺も初学者だけどhaskellは 文法しっかり覚えた方がいいぞx:xsとか構文糖衣で言い回しを変えてる所が沢山あってむしろお宅が悩んでる所はそこよ
0201デフォルトの名無しさん
2016/03/21(月) 08:57:12.63ID:XJIk5Rboそれは違う
「その部分」「どの部分」と言ってるからもっとピンポイントな答えが期待されてる
あの部分だな
0202デフォルトの名無しさん
2016/03/21(月) 15:57:08.54ID:em5aFOqL0203デフォルトの名無しさん
2016/03/21(月) 15:59:40.77ID:em5aFOqL0204デフォルトの名無しさん
2016/03/21(月) 21:30:37.79ID:W47zDOKQ構文糖という意味じゃなくて、Coreを見ても変わらないから本当にわからないんだって
0205デフォルトの名無しさん
2016/03/22(火) 00:33:33.60ID:oW40IkQfこれは型を見るとarityが2だけど値を見るとarityが1のような気がする
0206デフォルトの名無しさん
2016/03/22(火) 14:51:30.84ID:mpnhn3sE関数を一つの型に抽象化できると、論文やテキストを書くときに楽
0207デフォルトの名無しさん
2016/03/22(火) 19:21:14.33ID:oW40IkQf型クラスがなかった古い言語を無視して、現在のHaskellが何の得になるかという議論は
砂上の楼閣っぽい
0208デフォルトの名無しさん
2016/03/22(火) 20:34:04.20ID:mpnhn3sE言語表現そのもの
Haskellに何の得もないという意見は、日本語じゃプログラミングできないという意見と同レベル
0209デフォルトの名無しさん
2016/03/23(水) 22:02:39.24ID:r6iJqmyn0210デフォルトの名無しさん
2016/03/24(木) 17:36:19.24ID:xXG4RPew0211デフォルトの名無しさん
2016/03/24(木) 21:27:30.95ID:J6WmYFYybrew install haskell-stack
stack setup
で何かいけない理由があるのか?
0212デフォルトの名無しさん
2016/03/24(木) 22:50:37.70ID:gVM1g8dJ0213デフォルトの名無しさん
2016/03/25(金) 22:14:17.18ID:2hwI0Ray0214デフォルトの名無しさん
2016/03/25(金) 22:29:21.66ID:CJ0htTKH0215デフォルトの名無しさん
2016/03/25(金) 22:35:31.85ID:2hwI0Ray0216デフォルトの名無しさん
2016/03/25(金) 22:43:56.48ID:CnirOUU50217デフォルトの名無しさん
2016/03/25(金) 22:49:02.23ID:2hwI0Raybrew でやるとライブラリが入ってないって言われてそのつど入れたりimport文を書き直すハメになる
オフラインのスタンドアロンで使ってるから非常に困る
0218デフォルトの名無しさん
2016/03/25(金) 22:50:18.38ID:8xyGagLX0219デフォルトの名無しさん
2016/03/26(土) 02:10:19.19ID:kRgMl8e0だからなんでstack使わないの?
0220デフォルトの名無しさん
2016/03/26(土) 06:11:36.95ID:xgz3RPza0221デフォルトの名無しさん
2016/03/26(土) 10:52:26.15ID:7O7WN3J8自分で作ったコードが読めないんじゃなくて自分で意図してない依存関係が読めないんだよな
0222デフォルトの名無しさん
2016/03/27(日) 20:56:30.01ID:0fEHBexOel capitan の前はHaskellPlatform だけで完結してたプログラムなので、誰かなんとかしてほしい
0223デフォルトの名無しさん
2016/03/27(日) 21:15:53.61ID:qne5z7mnLeft 側の値に関数を適用するものは標準ライブラリにある?
readEither のエラーメッセージをもっと分かりやすいものに変えたい。
無ければ作るが、標準ライブラリにあるのなら、できるだけそれを使いたい。
0224デフォルトの名無しさん
2016/03/27(日) 22:56:01.91ID:0Jfntbhy0225デフォルトの名無しさん
2016/03/27(日) 23:08:58.39ID:0rC/ofPw詳しくはわからないが、El CapitanのセキュリティのしくみにHaskellPlatformが合わないらしい。
で、パッチを当てられたバージョンが配られてるっぽい。
http://stackoverflow.com/questions/32920452/how-to-run-haskell-on-osx-el-capitan
0226デフォルトの名無しさん
2016/03/27(日) 23:14:31.09ID:0Jfntbhyきちんと追随してないコードが早々にobsoleteになるのは諦めるしかない
0227デフォルトの名無しさん
2016/03/27(日) 23:14:35.18ID:0rC/ofPwBifunctorっていうのを見つけたよ
https://hackage.haskell.org/package/base-4.8.2.0/docs/Data-Bifunctor.html
0228デフォルトの名無しさん
2016/03/27(日) 23:29:56.66ID:0Jfntbhyあ、Base-4.8.0からBifunctor入ったんだ。知らなかった。
0229デフォルトの名無しさん
2016/03/28(月) 00:40:49.84ID:nQ5EzqqT0230デフォルトの名無しさん
2016/03/28(月) 00:57:36.40ID:nJiPkWp90231デフォルトの名無しさん
2016/03/28(月) 01:32:55.18ID:qcb2KDJp0232デフォルトの名無しさん
2016/03/28(月) 21:14:55.91ID:Lm1cq8wvBiFunctorを使うよ
0233デフォルトの名無しさん
2016/03/28(月) 21:40:11.75ID:iKsxfZekhttps://ask.fm/tanakh184/answers/135945765779
0234デフォルトの名無しさん
2016/03/28(月) 22:10:45.31ID:PPQPikPw0235デフォルトの名無しさん
2016/03/28(月) 22:24:37.12ID:eoKtZ9pp0236デフォルトの名無しさん
2016/03/28(月) 23:01:56.57ID:PPQPikPw0237デフォルトの名無しさん
2016/03/29(火) 07:10:25.38ID:YQCa1g4df +++ g = arr (bimap f g)
0238デフォルトの名無しさん
2016/03/29(火) 11:22:43.84ID:YQCa1g4d(arr f) *** (arr g) = arr (bimap f g)
(arr f) +++ (arr g) = arr (bimap f g)
0239デフォルトの名無しさん
2016/03/29(火) 20:58:59.61ID:WTA2j3Vpqt [] = []
qt (x:xs)=
let
s=[a|a<-xs,a<x]
b=[a|a<-xs,a>=x]
in qt s++[x]++qt b
main = do
print (qt [9,5,4,4,1])
これで[1,4,4,5,9]となって、b=[a|a<-xs,a>x]とすると
[1,4,5,9]となることに感動した
0240デフォルトの名無しさん
2016/03/30(水) 06:07:46.47ID:2BObmFiJこの人のツイッターめっちゃツイートしすぎじゃね??無職なの?ボットなの?
0241デフォルトの名無しさん
2016/03/30(水) 06:30:20.50ID:275vy7J80242デフォルトの名無しさん
2016/03/30(水) 13:21:10.20ID:Spu236HU0243デフォルトの名無しさん
2016/03/30(水) 14:14:52.38ID:qbKmn6Oyスーパーエンジニア()やで。お前の持ってるHaskell本の翻訳を手がけてる可能性もあるで
0244デフォルトの名無しさん
2016/04/01(金) 23:01:10.98ID:RonLnaIyc01 []=[]
c01 (x:xs)
| x=='?' = []
|otherwise =x:c01 xs
c02::String->[String]
c02 []=[]
c02 x=[_c01]
where
_c01=c01 x
main = do
print (c02 "213?46464?698")
言語感覚を掴むために文字列を?区切りの配列化とかやってんだけど
なんか上手くいかない。。後ろの方なんかどうにかスマートに取れんかな?
0245デフォルトの名無しさん
2016/04/01(金) 23:14:48.75ID:PV5EBc/WPrelude Data.List Data.List.Split> splitOn "?" "213?46464?698"
Loading package split-0.2.2 ... linking ... done.
["213","46464","698"]
Prelude Data.List Data.List.Split>
splitOn のソース
splitOn :: Eq a => [a] -> [a] -> [[a]]
splitOn = split . dropDelims . onSublist
0246デフォルトの名無しさん
2016/04/02(土) 00:30:07.50ID:Ev1W2wgksplit = split' [] ""
split' acc buff "" = reverse $ reverse buff :acc
split' acc buff (x:xs)
| x == '?' = split' (reverse buff :acc) "" xs
| otherwise = split' acc (x:buff) xs
main = print $ split "213?46464?698"
こんなもんだろ。既に区切った語のリストをaccに蓄積して
今読んでる途中の語はbuffに蓄積してやる(適宜reverseで順番を直す)
0247デフォルトの名無しさん
2016/04/02(土) 00:45:02.18ID:Ev1W2wgksplit "" = [""]
split (x:xs)
| x == '?' = "" :split xs
| otherwise = (x:hd):tl
where (hd:tl) = split xs
main = print $ split "213?46464?698"
蓄積引数を使って末尾再帰にするか
こちらにするかはまあ好きにしたらいいと思う。
0248デフォルトの名無しさん
2016/04/02(土) 01:38:17.07ID:Xzav67mJhttp://ideone.com/vh3Ovj
splitQ :: String -> [String]
splitQ s = unko id id s where
unko c1 c2 [] = c2 $ c1' : []
where c1' = c1 []
unko c1 c2 (x:xs)
| x == '?' = unko id (c2 . (c1 [] :)) xs
| otherwise = unko (c1 . (x :)) c2 xs
main = print $ splitQ "213?46464?698"
0249デフォルトの名無しさん
2016/04/02(土) 02:08:57.45ID:Xzav67mJmain = print $ take 10 $ splitQ $ cycle "213?46464?698?"
http://ideone.com/aKJZ7v
0250デフォルトの名無しさん
2016/04/02(土) 03:52:31.86ID:c4u50AAG0251デフォルトの名無しさん
2016/04/02(土) 10:40:52.55ID:HRtXuUOop = (/='?');
t xs = takeWhile p xs;
d xs = drop 1 $ dropWhile p xs
} in map t $ takeWhile (not . null) $ iterate d
0252デフォルトの名無しさん
2016/04/02(土) 10:44:33.90ID:HRtXuUOop = (/='?');
t xs = takeWhile p xs;
d xs = drop 1 $ dropWhile p xs
} in \ str -> map t $ takeWhile (not . null) $ iterate d str
■ このスレッドは過去ログ倉庫に格納されています