関数型プログラミング言語Haskell Part10 at TECH
[2ch|▼Menu]
361:デフォルトの名無しさん
09/03/25 22:00:07
>>360
> test ((->) a b) = a ++ b

これが可能な型コンストラクタの例をあげてみて

362:デフォルトの名無しさん
09/03/25 22:52:33
runWriter >>> (printf "\nresult : %d\n" *** debugPrint) >>> uncurry (>>) $ foo 10 0
(IO a, IO a)をIO aにしようと思えばこういう風に結合するしかないんでしょうか?
m(m a)や[m a]をならすjoinやsequenceみたいなものがあると思うんですが

363:デフォルトの名無しさん
09/03/25 23:00:55
結合ってのは uncurry (>>)の部分でArrowの濫用をしているというところではないです。
しかし自重してかつリスプみたいにならないで済む方法があれば教えてほしいです。
haskell初心者にありがちなポイントフリー厨になっているというところは多少自覚しておりますorg。

364:デフォルトの名無しさん
09/03/25 23:44:22
>>359
読んでみたけど、入門以前な私にはちょっと難しかったです。
fstは組み込みの演算子でタプルの先頭を取り出すと理解しましたが、
一つ目の例だと先行評価の例でもコンパイル時に(\x -> fst (sum x, product x))を(sum x)
と最適化してから実行したらどうなのかな?と思いました。要するにCでいうこんなのかなと。
int t1, t2;
t1 = sum(x);
t2 = product(x); //副作用がないなら、これコンパイル時に消えるんじゃない?簡約というのは実行とはちがうのかな。
return t1;
二つ目の例だと、(やはりCとかを仮定すると)sumとproductの引数xは同一の変数というイメージがあります。
整数のリストへのポインタみたいな感じをもっていると、遅延評価の例で
「sumが0+1+2+3+4になったときのxをproductで使える」とどう嬉しいのかイマイチです…
よくわからないので、本読んでみることにしました。最初はテンプレにあるIntroduction to Functional Programming Using Haskellというのでいい?

365:デフォルトの名無しさん
09/03/26 00:13:22
>>364
> int t1, t2;
> t1 = sum(x);
> t2 = product(x); //副作用がないなら、これコンパイル時に消えるんじゃない?簡約というのは実行とはちがうのかな。
> return t1;

コンパイル時に消えるかどうかはコンパイラの実装依存だと思うけど(GHCだとどうかはもっとエロい人、お願い)、実行時にはproduct(x)はHaskellでは評価されない、という話がそのページに書いてある。
Cでも、product(x)が副作用がないっていうことが分かっていればコンパイル時に消えるだろうけど(GCCではそんなマークがつけられたような…)、それは普通は分からないし、原則的に副作用があると仮定されている。

つまり、デフォルトでは、副作用ありだと考えていちおう実行するのがC、副作用なしだと考えて実行しないのかHaskell、ということ。
べつに、Cでもコンパイラの特殊な拡張構文とかを使って副作用なしマークを付けまくるぜ、というのであれば、この点に限ればたいして違いはないと思う。


> 二つ目の例だと、(やはりCとかを仮定すると)sumとproductの引数xは同一の変数というイメージがあります。
> 整数のリストへのポインタみたいな感じをもっていると、遅延評価の例で
> 「sumが0+1+2+3+4になったときのxをproductで使える」とどう嬉しいのかイマイチです…

これは、Cだと当然そうで、Haskellのほうがすごいわけじゃない。
ただ、Haskellへの誤解として、

(\x -> (sum x, product x)) [0..5]
=> (sum [0..5], product [0..5])
=> (sum [0,1,2,3,4,5], product [0..5])
=> (15, product [0..5]])
=> (15, product [0,1,2,3,4,5])
=> (15, 0)

という評価をしている([0..5]が二回評価されている)という誤解がありえるから、それを否定しているわけ。
Cと同じ(というか正格評価と同じ)オーダで計算できますよ、ということ。

366:デフォルトの名無しさん
09/03/26 07:35:35
>>355は明らかに宿題だろw

367:デフォルトの名無しさん
09/03/26 20:24:39
fun of programming からの問題についての質問です。

newtype Except a b c = E(a b (Either String c))

instance ArrowChoice a => Arrow (Except a) where

↑この定義を求めよ、という問題がありますが分かりませんでした。Arrowに
Stringの例外を挿入するということなんですが、挫折しました。

どうかよろしくお願いいたします。

368:デフォルトの名無しさん
09/03/26 22:16:40
個別スレがないのでここで聞いてみますが
lazy-k(もしくはunlambda)をラムダ式にしてくれるような変換器って
どっかにないでしょうか

369:デフォルトの名無しさん
09/03/26 22:23:59
>>366
本当に興味から聞いてみたんだけど、定番の宿題だったのかな
それはすいませんでした。とりあえずPogramming in Haskellを買いましたよっと

370:デフォルトの名無しさん
09/03/26 22:47:28
>>367
書いてみた。添削希望

import qualified Control.Category
import Control.Category((>>>), Category)
import Control.Arrow

newtype Except a b c = E (a b (Either String c))

instance (ArrowChoice a) => Category (Except a) where
  id = E $ arr Right
  E g . E f = E $ f >>> (arr Left ||| g)

instance (ArrowChoice a) => Arrow (Except a) where
  arr f = E $ arr (Right . f)
  first (E a) = E $ first a >>> arr combine
    where
      combine (Left e, _) = Left e
      combine (Right x, y) = Right (x, y)

371:デフォルトの名無しさん
09/03/27 09:43:38
riみたいにコンソールからドキュメントを参照できたらいいのになぁー
それがあればemacsからdescribe-functionとかfind-functionみたいに
コードから一発で飛ぶとかできて便利になるのに…

372:367
09/03/27 20:16:35
>>370
ありがとうございます!

373:デフォルトの名無しさん
09/03/28 14:25:12
GHC 使ってて気付いた。
breakEnd ってリストとか ByteString に使えるやつはあるんだけど、
String バージョンは無いの?

374:デフォルトの名無しさん
09/03/28 19:14:57
fromString って何の意味があんの?
read があればいらないんじゃね?

375:デフォルトの名無しさん
09/03/28 19:57:08
役割が違うだろ

read "\"foo\"" :: String
  = "foo"
fromString "\"foo\"" :: String
  = "\"foo\""

376:デフォルトの名無しさん
09/03/28 21:18:11
>>375
thx

377:デフォルトの名無しさん
09/03/29 01:04:31
Parsecみたいにコンビネータで柔軟に書式を構築できて
コンパイル時に書式をチェックできるようなprintfはありませんかね?
%4dみたいな数字の表現が辛いから無理なんでしょうかね

378:デフォルトの名無しさん
09/03/29 02:49:49
>>377
いいたいことがよくわからん。
コードで例を書いてくれ

379:デフォルトの名無しさん
09/03/29 12:43:42
>>377
これ?
URLリンク(www.cs.nott.ac.uk)


380:デフォルトの名無しさん
09/03/30 12:33:00
>>378
int_ @ alighLeft 3 >> ", " >> str_
から(\n s -> take 3 (show n++repeat ' ') ++ ', ' ++ ", " ++ s)
みたいな関数を返すような演算って絶対誰か考えてる筈だなと思ってました

>>379
それです
unparsingっていうんですね、その考えはありませんでした

381:デフォルトの名無しさん
09/04/02 09:28:08
GHC 6.10.2がリリースされてた。
URLリンク(haskell.org)


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5402日前に更新/104 KB
担当:undef