関数型プログラミング言語Haskell Part27_©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
2015/01/08(木) 21:02:35.67ID:IQPOX3u7haskell.org (公式サイト)
http://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part26
http://peace.2ch.net/test/read.cgi/tech/1406436392/
0685デフォルトの名無しさん
2015/02/25(水) 11:25:52.12ID:EI9coWAt純粋な関数の作用は「値を返すこと」だよ。Haskellでは「普通の意味では値を返さない」関数も ()::()を返すことによって
形式上は値を返す。
0686デフォルトの名無しさん
2015/02/25(水) 11:30:47.69ID:EI9coWAtある値に次々と関数を適用する場面を考える。最初の値をxとしよう。
1.まず f を適用すると f x になる
2.つぎに、この結果に対して g を適用すると g ( f x) となる。
3.つぎに、この結果に対して h を適用すると h ( g ( f x ) ) となる。
こうしてみると、思考の流れである『 to x, apply f, then apply g, then apply h ...』 と左右が逆になってる。
>>= はKleisli射に対して x f g h の順番で書けるように工夫したものだと、言える。(ざっくりした説明)
0687デフォルトの名無しさん
2015/02/25(水) 13:41:55.23ID:20DVabgTこのスレの住人とて捻り鉢巻な難易度なのだろう
0688デフォルトの名無しさん
2015/02/25(水) 13:59:16.45ID:zpTHLWvM>>676
>>677
>>679
例えば、
x=1; y=2; x=x+y; print x; print y
という命令型プログラムを純粋関数で書くと
どうなるのでしょうか
0689デフォルトの名無しさん
2015/02/25(水) 17:10:15.53ID:4X+FbhYDメモリの値とターミナルの状態という機械状態を
S=<("x",Vx),("y",Vy),(T)>と表すとして
だとして、
x=1;
→ 関数(f1) --- f1 <("x",Vx),("y",Vy),(T)> = <("x",1),("y",Vy),(T)>
y=2;
→ 関数(f2) --- f2 <("x",Vx),("y",Vy),(T)> = <("x",Vx),("y",2),(T)>
x=x+y;
→ 関数f3 --- f3 <("x",Vx),("y",Vy),(T)> = <("x",Vx+Vy),("y",Vy),(T)>
print x;
→ 関数f4 --- f4 <("x",Vx),("y",Vy),(T)> = <("x",Vx),("y",Vy),(T++show Vx)>
print y;
→関数f5 --- f5 <("x",Vx),("y",Vy),(T)> = <("x",Vx),("y",Vy),(T++show Vy)>
で、これを(逐次実行は関数合成として理解できるので)関数合成すると
f5 . f4 . f3 . f2 . f1 <("x",Vx),("y",Vy),(T)> = <("x",3),("y",2),(T++ "3" ++ "2" )>
という関数になる。
0690デフォルトの名無しさん
2015/02/25(水) 17:16:52.68ID:GkGCDPjknewIORef 1 >>= \ x ->
newIORef 2 >>= \ y ->
(fmap (+) (readIORef x) <*> readIORef y) >>= writeIORef x >>= \ () ->
readIORef x >>= print >>= \ () ->
readIORef y >>= print
0691デフォルトの名無しさん
2015/02/25(水) 17:17:12.91ID:4X+FbhYDS → S なので、そのグラフはS×Sで、
つまり命令形の手続きはSの直積の部分集合と同一視できるということになる(というか数学的には同一)。
0692デフォルトの名無しさん
2015/02/25(水) 17:18:00.41ID:4X+FbhYDあ、そういう答えを要求してるんだったのか……
0693デフォルトの名無しさん
2015/02/25(水) 20:03:19.53ID:zpTHLWvM今の時点で気になっているのは、ここにある各演算毎の関数的定義は、
演算が置かれている場所や状態空間が少し変わると、同じ演算なのに
変わってしまうということはないのでしょうか?
例えば、状態空間の中にzが加わると、同じ演算の関数定義が変わってしまう
ということはないのでしょうか?
もしそうだとすると、命令型の手続きを純粋関数で書けるというのはやや
誤解を生じるのではないかと思うのですが。
0694デフォルトの名無しさん
2015/02/25(水) 20:13:44.32ID:YonVottMありがとうございます
互換性に不安を抱えたまま開発を続けるのはつらいのでReflectionを使わない方法を模索することにします
0695デフォルトの名無しさん
2015/02/25(水) 21:40:11.60ID:4X+FbhYD>演算が置かれている場所や状態空間が少し変わると、同じ演算なのに
>変わってしまうということはないのでしょうか?
というか、逐次実行が関数合成になるように状態空間を定めるので、話は逆。
手続が内部で持ってる状態を全部引数に蓄積子として突っ込んでいけば
最終的に必ず純粋な関数になるので大丈夫、というだけの話ではあり。
0696デフォルトの名無しさん
2015/02/25(水) 21:48:26.31ID:Slhdy+4b各行は定義ではなく、具体的な状態Sが関数適用でどう変化しているかを述べていて、
>>688は説明を簡単にするためにxとyとターミナルの状態のみを扱っている
例えばx=1という式はx以外の変数やターミナルの状態を変えないから、
f1 <("x", _), vars, T > = <("x", 1), vars, T>
みたいに書ける。これならzをどこに入れようが定義は変わらない。
0697デフォルトの名無しさん
2015/02/25(水) 22:52:25.07ID:zpTHLWvMできないということなのでしょうか
0698デフォルトの名無しさん
2015/02/26(木) 01:10:29.61ID:XuDII8Liしかし、それは人間的困難に過ぎないので、そこを捨象すれば
チューリングマシンとラムダ算法が等価であるというのとまったく同じ意味において、
両者は等価であり、区別することはできない。
0699デフォルトの名無しさん
2015/02/26(木) 02:12:16.21ID:D8nkDIffモナドは暗黙の状態引き渡しをやる仕組みと言えなくもないし、部分的には命令型的パラダイムを導入してるという考え方はできる。
0700デフォルトの名無しさん
2015/02/26(木) 08:46:56.43ID:y/w7Kxu/0701デフォルトの名無しさん
2015/02/26(木) 10:19:14.44ID:WaBGyhy5お前、毛の壁ナイズされ過ぎ。
0702デフォルトの名無しさん
2015/02/26(木) 10:34:39.06ID:BNBT94Ul0703デフォルトの名無しさん
2015/02/26(木) 11:05:53.08ID:QQhjsWl00704デフォルトの名無しさん
2015/02/26(木) 11:15:19.32ID:btOYc4SG0705デフォルトの名無しさん
2015/02/26(木) 11:31:19.10ID:dD65fmOlスポーツとかなら10年かかっても不思議ではないのに
0706デフォルトの名無しさん
2015/02/26(木) 11:59:30.21ID:QQhjsWl0「XはYである」と言うならYと見なした理由もちゃんと書け馬鹿。XをYと見なした時にどんだけ便利なのか書け馬鹿。
おめーは自然数を教えるのにチャーチ数を教えるのか馬鹿。
おめーは「脳はコンピュータと言える」とか言って脳の研究でコンピュータを調べるのか馬鹿。
そんな絶望的な馬鹿なら10年かかっても不思議じゃねーよ。
0707デフォルトの名無しさん
2015/02/26(木) 12:00:51.61ID:btOYc4SG早期教育が必要
0708デフォルトの名無しさん
2015/02/26(木) 14:42:26.59ID:dD65fmOl0709デフォルトの名無しさん
2015/02/26(木) 21:35:55.82ID:+ZHOz+Fzその通りだと思う。
しかしその具体的な動きはすでにあるのかな?
>>701
いや、Okabe氏は素晴らしいと思うよ。
彼にはもっともっと発信してほしい。
0710デフォルトの名無しさん
2015/02/26(木) 22:40:22.30ID:u37SJBGi他の言語書いたことないやつとかhaskell語るなよ
0711デフォルトの名無しさん
2015/02/27(金) 13:21:41.48ID:luo4R3jS俺も俺も。ああいうキチガイ芸人にはもっと発信して欲しかった。Qiitaの運営も見る目がない。
0712デフォルトの名無しさん
2015/02/27(金) 18:39:34.08ID:/mo2HZHK0713デフォルトの名無しさん
2015/02/27(金) 20:57:22.30ID:QBCyKoaphaskellやってる人で他の言語やった事ない人ってすごい少数派だと思うぞ
0714デフォルトの名無しさん
2015/02/27(金) 21:55:00.85ID:6wGrZzep0715デフォルトの名無しさん
2015/02/28(土) 07:19:37.54ID:dnl6aVQ8他言語はおろかhaskellを使っているかも怪しい。
0716デフォルトの名無しさん
2015/02/28(土) 11:31:00.53ID:/a49nmDi本当はPython使ってるだろ
0717デフォルトの名無しさん
2015/02/28(土) 12:00:03.72ID:lNsAK58t0718デフォルトの名無しさん
2015/02/28(土) 12:18:51.86ID:d9oEn1cs0719デフォルトの名無しさん
2015/02/28(土) 12:53:22.56ID:/a49nmDi0720デフォルトの名無しさん
2015/02/28(土) 14:57:14.27ID:WBmhRPKMParsecが激しく便利なのでやめられないし、グルー言語としても優秀。
後はふと思いついたことをプロトタイピングして試すのにとても便利。
モナドの中を除いてコードをどこにどういう順番で書いても大丈夫なのが地味に利く。
0721デフォルトの名無しさん
2015/02/28(土) 17:21:51.10ID:+vurDehh>後はふと思いついたことをプロトタイピングして試すのにとても便利。
ここは禿しく同意
0722デフォルトの名無しさん
2015/02/28(土) 17:34:44.86ID:ww/ZmHX+0723デフォルトの名無しさん
2015/02/28(土) 17:35:54.16ID:ww/ZmHX+あのスレID付く前は勢いすごかったのにな
0724デフォルトの名無しさん
2015/02/28(土) 17:37:41.63ID:0XiMknGfn年前から「今年盛り上がる」って言われ続けてる
0725デフォルトの名無しさん
2015/02/28(土) 20:20:30.25ID:4FBvatWb0726デフォルトの名無しさん
2015/02/28(土) 20:27:53.14ID:Ywc+frof0727デフォルトの名無しさん
2015/02/28(土) 20:51:48.98ID:0l2BG5kB急きょ引き上げられるなど、対応の不備が指摘されました。
この問題を話し合うシンポジウムが28日東京で開かれ、上限の引き上げや事前の同意の
必要性について意見が交わされました。
4年前の原発事故では、当初100ミリシーベルトとしていた緊急時の被ばく限度が収束作業に
支障が出るとして、事故の3日後、急きょ250ミリシーベルトに引き上げられました。
事故の6日後、政府はさらに国際機関が推奨している500ミリシーベルトへの引き上げを検討しましたが、
事故対応に当たった防衛省や警察庁からも反対の声が上がり、見送られました。
シンポジウムは放射線防護の専門家で作る日本保健物理学会が開き、東京電力の担当者は、
174人が100ミリシーベルトを超え、250ミリシーベルトを超えた作業員も6人いたことを報告し、
「引き上げがなければ作業はより難しかった」と話しました。
パネリストからは、「国際的な基準に合わせるべきだ」といった意見の一方、
「250ミリシーベルトも500ミリシーベルトも医学的な根拠となるデータが少なく、納得が得られるか疑問だ」
といった意見も出されました。
また、数字の議論だけでなく、事前に同意を得ることや、長期的な健康調査も重要な検討事項
だという指摘が出されていました。
作業員の被ばく限度について原子力規制委員会は、250ミリシーベルトへの引き上げを軸に、
事前の意思確認や教育などを事業者に求めていく方向で検討することにしています。
一方で、上限の引き上げについては労働者団体などが反対しているほか、
厚生労働省が慎重な姿勢を見せています。
原発事故以降、廃炉現場での被ばく対策を求めるなど、作業員の支援をしている東京労働安全衛生センターの
飯田勝泰事務局長は、「被ばくを余儀なくされる人たちが生涯背負う健康リスクに誰が責任を負うのか、
その後に生じるさまざまな問題に対してどれだけサポートや補償などがあるかを含めて、
当事者を交えて議論すべきだ」と訴えています。
0728デフォルトの名無しさん
2015/02/28(土) 22:05:28.81ID:BICS2QXMおいHaskellerを刺激するなよ
0729デフォルトの名無しさん
2015/02/28(土) 23:57:43.09ID:Nt6Wj8CT0730デフォルトの名無しさん
2015/03/01(日) 00:00:10.61ID:fa5PZpFWヘッジファンドに就職するもんだよ。
0731KenOkabe
2015/03/01(日) 00:24:52.20ID:pyXXwOct0732デフォルトの名無しさん
2015/03/01(日) 12:33:53.88ID:V/GWmw6Dclass ABC t where
abc :: t -> IO Int
data X = 何か
instnce ABC X where
abc x = 何か
アプリケーションの本番環境ではこれでいいのですが、
この型Xの値を使う環境の方をデバッグしたりテストする場合に問題が起きました。
abc関数をX型の値に適用したとき、戻り値を以前戻した値に基づいて計算したいとか、
適用する度に予め用意したリストから順に値を戻したいという場合があります。
例えば初めての適用なら5::IO Intを、2回目の適用なら13::IO Intを戻したいとか。
前回10::IO Intを戻したなら、今回はerror関数を使って例外を投げるとか。
状態を保存しないとできないことです。
このようなことが本番環境でも必要なら、ABC型クラスの定義を例えば下記のように変え、
class ABC t where
abc :: t -> IO (Int, t)
X型の値の中に状態を保存するようにします(要はMap型などと同じやり方です)。
しかし、今回はデバッグやテストのためだけです。
そのためだけに全体のアーキテクチャを変えてしまうのは如何なものかとも思うのですが、
デバッグやテスト優先で変えるべきでしょうか。
それとも、関数を使用する側は変えなくても良い、
あるいは変えるとしても些細な修正ですむ方法があるでしょうか。
0733デフォルトの名無しさん
2015/03/01(日) 12:46:43.60ID:FWNFrpmY0734デフォルトの名無しさん
2015/03/01(日) 13:21:28.34ID:OeCCJL5wunsafePerformIO使う(というかまさに使いドコロ)。
0735デフォルトの名無しさん
2015/03/01(日) 14:22:17.54ID:y+77PkOTabc x = do{(y:ys)<-readIORef global_abc; writeIORef global_abc ys; return y}
0736デフォルトの名無しさん
2015/03/01(日) 15:10:50.59ID:V/GWmw6Dデバッグやテストが目的なら躊躇せずSystem.IO.Unsfe系を使いましょうと言うことですか。
本番環境ではさすがに使いたくないですが、本番環境を汚さずにデバッグやテストするのが目的なら、
悩んで複雑な仕組みを構築するより、気をつけてUnsafe系を使う方法を考えた方が建設的てすね。
アドバイスありがとうございます。
>>733
どういうことでしょうか。
0737デフォルトの名無しさん
2015/03/01(日) 15:42:52.81ID:YT+HWRLqabct t = do
0738デフォルトの名無しさん
2015/03/01(日) 15:45:51.87ID:YT+HWRLqabct t = do
r <- abc t
return (r, t)
0739デフォルトの名無しさん
2015/03/01(日) 17:59:38.32ID:V/GWmw6D>>732でも言いましたが、本番環境でも状態を保存する必要があるのなら
私も迷わずその方法を採用したいと思います。
しかし、今回はデバッグやテストのためたけの仕組みです。
abc関数を使用する(呼ぶ)側にはあまり手を着けたくないというのが正直なところです。
多少修正する程度でしたらまだいいのですが、戻り値で状態を返し、
関数の呼び出し側でそれを保持するとなると、アプリケーションの作り方にまで影響が及びます。
できればそれはちょっと避けたいな、と。
0740デフォルトの名無しさん
2015/03/01(日) 18:02:35.56ID:DwkMIW7dWriterモナドとか
0741デフォルトの名無しさん
2015/03/01(日) 19:28:30.37ID:YT+HWRLqデバッグ用テスト用のファイル/モジュールでt -> IO (Int, t)を返す関数を定義すれば本番用のコードを汚さないよ?
0742デフォルトの名無しさん
2015/03/01(日) 19:54:14.26ID:2wRYmT3l0743デフォルトの名無しさん
2015/03/01(日) 22:48:32.59ID:V/GWmw6D後出しじゃんけんのようで本当にすいません。
結局やりたいのはこういうことです。
本番環境
ModuleA
ABCクラスのインスタンス型の値を使う
ModuleB
ABCクラスの定義(abc :: t -> IO Int)
ModuleC
ABCクラスのインスタンス型Xの定義
ModuleD
ABCクラスのインスタンス型Yの定義
テストやデバッグ用
ModuleX
ModuleAの関数のテストやデバッグのために
ABCクラスのインスタンス型Zの定義
要するにスタブとかダミーみたいなもの
ただし、状態を保ちたい
ABCクラスのインスタンス型の値の状態を保つことは、
本番環境では不要なことなんです。
状態を保たなくてもアプリケーションの処理は問題なく回ります。
本番環境に無くても良い余計な処理は入れたくないです。
ModuleAから呼ぶ関数はModuleBで定義したABCクラスのabc関数であって、
>>738のabct関数をModuleXで定義しても、ModuleAからは呼ばれません。
トンチンカンなことを言っていたらごめんなさい。
0744デフォルトの名無しさん
2015/03/01(日) 23:04:42.28ID:V/GWmw6DWriter Int型を使うということでしょうか。
今回の目的を達成するためにはどのように使えばよいか考えてみましたが、
すいません、よく分かりませんでした。
どのように使えばよいのでしょうか。
>>742
こちらも、どのように使えば目的が達成できるか、分かりませんでした。
お二人とも、簡単な例を示していただけると助かります。
0745デフォルトの名無しさん
2015/03/02(月) 00:13:52.37ID:6Ba1RdPXすいません、これがマズい言い方でした。
> アプリケーションの本番環境ではこれでいいのですが、
> この型Xの値を使う環境の方をデバッグしたりテストする場合に問題が起きました。
これでは、型Xを使う側は本番環境ではないように聞こえますね。
ここで言いたかったことは>>743の前半の状況です。
紛らわしくてごめんなさい。
0746デフォルトの名無しさん
2015/03/02(月) 01:22:46.34ID:Sw+/g9Qu例えばnewが不要な所ではstatic変数を使いたいとか
たまにそういう人いるよね
0747デフォルトの名無しさん
2015/03/02(月) 06:52:05.12ID:6Ba1RdPX良くないことでしょうか。
0748デフォルトの名無しさん
2015/03/02(月) 07:15:11.30ID:IugrOvyfdata BinTree = Empty | Node{val :: a, left :: BinTree a, right :: BinTree a} deriving Show
newtype BinSrchTree a = BinTree a deriving (Show, Eq, Ord)
main = print (Empty :: BinSrchTree Int) --BinSrchTree IntがBinTree a0に一致しない言われる
0749デフォルトの名無しさん
2015/03/02(月) 09:57:42.00ID:oxqFLeZknewtype BinSrchTree a = BS (BinTree a) deriving Show
main = print (BS Empty :: BinSrchTree Int)
ghci> main
BS Empty
0750デフォルトの名無しさん
2015/03/02(月) 10:08:38.53ID:IugrOvyfありがとうございます
0751デフォルトの名無しさん
2015/03/02(月) 11:04:53.22ID:Sw+/g9Qustatic変数というかグローバル変数は
引数や戻り値の型を無視してデータの受け渡しをするので型システムにとっては悪い
0752デフォルトの名無しさん
2015/03/02(月) 12:36:54.96ID:6Ba1RdPXそういう意味でしたか。
staticを静的の意味と勘違いしていました。
それで、意味は分かりましたが、今回の私の件に
どのように繋がってくるでしょうか。
私への教訓でしたら大事なことなのでしっかり聞いておきたいです。
0753デフォルトの名無しさん
2015/03/02(月) 13:17:22.99ID:Sw+/g9Qu型システムの目的は本番環境の処理を速くすることではないので
目的が違う人と対立する場合もあります
0754デフォルトの名無しさん
2015/03/02(月) 14:13:28.84ID:YiBmijbSこれ何か問題があるの?
その後の指摘?とのつながりが分からん
0755デフォルトの名無しさん
2015/03/03(火) 11:43:12.43ID:SAUuRVc4[入門]関数プログラミング―質の高いコードをすばやく直感的に書ける!
http://gihyo.jp/dev/feature/01/functional-prog
0756デフォルトの名無しさん
2015/03/03(火) 13:50:00.68ID:RopS8Jun0757デフォルトの名無しさん
2015/03/03(火) 16:24:30.16ID:uc5uKGLfそれは思った
0758デフォルトの名無しさん
2015/03/03(火) 18:44:42.74ID:0qnRlFIR関数型という表記でなんの問題もないのだが。
それより、一部で根強い「関数プログラミング」という表記のほうがイヤ。
0759デフォルトの名無しさん
2015/03/03(火) 18:59:03.33ID:WJJOCC/KBird & Wadler を訳した武井さんに敬意を表してるんだろうな
0760デフォルトの名無しさん
2015/03/03(火) 19:01:24.47ID:0NfvnnKp0761デフォルトの名無しさん
2015/03/03(火) 20:17:41.38ID:RopS8Junその理屈に則るなら誤解をされないように(筆者の)関数型じゃなくてHaskellって表記すればいいのにってだけ
0762デフォルトの名無しさん
2015/03/03(火) 20:25:58.13ID:0qnRlFIRあの内容なら別にOCaml使っても同じだろ。
そもそもHaskellの布教したいわけじゃなくて、
kazの定義するところの「関数型」の布教がしたいんだろうからな。
0763デフォルトの名無しさん
2015/03/03(火) 22:34:31.14ID:9fOX7cOmdata Foo = Foo {bar :: Int}
let foo = Foo 1
let baz =foo {bar = 10 + bar foo}
この bar = 10 + bar foo を bar = 10 + bar でできるようにする言語拡張ってないの?
0764デフォルトの名無しさん
2015/03/04(水) 01:10:55.55ID:OQ0tAhEv0765デフォルトの名無しさん
2015/03/04(水) 01:33:39.74ID:EScOogLy0766デフォルトの名無しさん
2015/03/04(水) 01:42:46.42ID:3Rn4etK5使える状況が限定されるけどRcordWildCards
あとは演算子がキモいlens
0767デフォルトの名無しさん
2015/03/04(水) 02:05:22.33ID:OQ0tAhEv0768デフォルトの名無しさん
2015/03/04(水) 02:34:52.77ID:EScOogLyタプルという以上のものではない、というつもりで作られてることが
わかってれば、トップレベルの名前空間にぶちまけられてることも
そういう更新の仕方ができないことも不思議でもなんでもないんだけどね。
0769デフォルトの名無しさん
2015/03/04(水) 17:54:26.26ID:77Av1QBL0770デフォルトの名無しさん
2015/03/04(水) 17:55:24.64ID:77Av1QBL0771デフォルトの名無しさん
2015/03/04(水) 18:52:46.28ID:4mY/lS/X0772デフォルトの名無しさん
2015/03/04(水) 19:22:58.77ID:Z9o39cjFデータ型あたらしく定義すれば
0773デフォルトの名無しさん
2015/03/04(水) 19:24:29.53ID:EScOogLy趣旨がわからんが
data StrIntgr = Str String | Intgr Int deriving Show
f n = if n < 0 then Str "I don't like negative numbers." else Intgr n
みたいな直和型ではなんかいかんの?
ここで聞く前になにか自分で入門書読んだ方がよさそうな気がするが。
0774デフォルトの名無しさん
2015/03/04(水) 19:41:36.42ID:4mY/lS/X言葉足らずですまん
もちろん自前で型をつければできるのは分かってるんだけど
型つけるといちいち型から取り出す関数を定義するとかFunctorクラスを実装するとかが必要になってきて
2つの異なる型を返す可能性があるだけで割と手間がかかるようになるけどHaskellだとそれが当たり前なのかなって
0775デフォルトの名無しさん
2015/03/04(水) 19:43:00.66ID:ZS6cL3ZV0776デフォルトの名無しさん
2015/03/04(水) 19:45:42.96ID:EScOogLy>2つの異なる型を返す可能性があるだけで割と手間がかかるようになるけどHaskellだとそれが当たり前なのかなって
そりゃ当たり前。そうじゃなきゃ型システムが台無しだろうが。
EitherつかってもRight/Leftのパターンマッチで取り出すのはおんなじ。
0777デフォルトの名無しさん
2015/03/04(水) 20:05:47.70ID:3Rn4etK50778デフォルトの名無しさん
2015/03/04(水) 21:43:20.18ID:P3s4t/V2OCamlならopen variantで新たなデータ型を宣言しなくてもいいが。
0779デフォルトの名無しさん
2015/03/04(水) 21:51:55.05ID:zsHu2OsZHaskellはできないけど
0780デフォルトの名無しさん
2015/03/04(水) 23:24:56.05ID:Ts02LONaわかった。
ありがと。
0781デフォルトの名無しさん
2015/03/05(木) 14:45:16.80ID:HeDoVjrI先頭からcondをチェックして、Trueの場合はtodoを実行し、以降のチェックはしたくない時は
どのように書くのがスマートですか?
手続き型だとループを回してbreak/returnで抜けるパターンです
よろしくお願いします。
0782デフォルトの名無しさん
2015/03/05(木) 16:02:01.66ID:HeDoVjrI0783デフォルトの名無しさん
2015/03/05(木) 16:40:37.70ID:A3rdoDeo0784デフォルトの名無しさん
2015/03/05(木) 17:34:45.93ID:URkoYrlqという感じに書くけど、再帰でもなんでも好きに書けばいいんじゃないか
■ このスレッドは過去ログ倉庫に格納されています