08/10/03 03:06:21
>テストが元実装と結局ほとんど同じにならない?
ならない。>>805-806を見れば分かる通り
>元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
>結局同じになるのは必然だと思うんだけど。
そういう場合もあるし、そうでない場合もあるから、決して必然じゃない
たとえば、ソート関数が正しいかどうか確認するコードと、
実際にマージソートやクイックソートをするコードは全然違うものになる
さらに「マージソートでもクイックソートでも結果が同じになる」みたいなのもテストになるし
>でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
もちろん
だれもテストで全ての誤りを発見できるとは思ってない
810:デフォルトの名無しさん
08/10/03 14:26:34
あと、ランダムテストが有効な場合とそうでない場合があるよね。
>>805-806はあまりランダムである必要が無いかも。
きわどいケース(上の場合だと0、非正規化数、無限大、NaN)を
並べ上げにくい場合にランダムテストが有効な気がする。
811:デフォルトの名無しさん
08/10/03 14:35:10
ああそうか、例えばソートの例の場合、
「正しくマージソート出来てるか」じゃなくて
「正しくソート出来てるか」のテストになるからか。
前者はQuickCheckに関わらず外部テストでは確かめようがないから、
「ソートする」じゃなくて「マージソートする」という仕様はソースレビューするしかないのか。
812:デフォルトの名無しさん
08/10/03 16:36:28
単なる関数じゃあまり意味がなくて、
結果としてのアウトプットが特徴的で綺麗な性質を持ち、
かつ、その性質自体が目的である場合に威力を発揮するって感じか。
その類の物は、性能が競われる事が多い気がするから、その辺りのサポートもあると良いかも。
813:デフォルトの名無しさん
08/10/03 18:38:09
2chって連続した半角スペースが に置換されるようになったの?
f :: A -> B のテストは
・B (or A) の == を使う場合
・一般の場合
・h :: A -> B を用意して f x == h x をテスト
・逆関数 g :: B -> A がある場合
・x == g (f x) をテスト
・y == f (g y) をテスト
・使わない場合
・r :: A -> B -> Bool をうまく用意して r x (f x) をテスト
(テストはランダムな x :: A, y :: B に対して)
大概こんな感じ。
元実装とほとんど同じテストってのは、
g やうまい r が無くて、f x == h x というテストしか無いんだけど、
f と違う h も無くて、でも f x == f x じゃバカ丸出しなので、
== を明示的には使わないで実質的に f x == f x と同じことをやる、
みたいな感じじゃないかな。
814:デフォルトの名無しさん
08/10/03 18:39:53
うわ俺バカ丸出し。 って書きたかった。
815:デフォルトの名無しさん
08/10/03 19:31:09
datを直接見るようにすればnbspなんて使わなくてもインデントされるよ
816:デフォルトの名無しさん
08/10/08 12:19:55
滅茶苦茶な事を聞いていそうで済みませんが、
cabal configure と runhaskell Setup.hs configure、
cabal build と runhaskell Setup.hs build、
cabal install と runhaskell Setup.hs install、
って何か違うんでしょうか。
同じだとしたらなんのために両方あるんでしょうか。
817:初心者修業中
08/10/08 15:33:21
>>816
・runhaskell はHaskellのソースプログラムを実行するコマンド
・cabal はパッケージをインストールするコマンド
…と認識しています。
参考
↓
URLリンク(haskell.g.hatena.ne.jp)
818:デフォルトの名無しさん
08/10/08 23:08:47
オラ本でねーぞコラ
819:デフォルトの名無しさん
08/10/09 00:31:08
cabal なんてコマンドあるの?
あるとしたら runghc Setup と打つより楽だからじゃ?
820:初心者修業中
08/10/09 01:00:41
>>819
参考
↓
URLリンク(haskell.g.hatena.ne.jp)
cabal-installというパッケージにcabalというユーティリティがあった。
パッケージのダウンロードからインストールまでを自動化してくれるようだ。
821:デフォルトの名無しさん
08/10/09 04:00:42
今んとこ、RubyGemsを目指して整備中って事で、
最終的にSetup.hsはなくなるかオプショナルになってcabalコマンドに統一されるんじゃない?
URLリンク(page.freett.com)
URLリンク(hackage.haskell.org)
現時点でのそれら重複してるコマンドの詳細は判らないけど、installについては、
cabal install monadius
monadius
で遊べるってのは、Setup.hsでは無理だろう。
822:デフォルトの名無しさん
08/10/09 04:20:27
>>821
RubyGemsなんて目指されると非常に困る。
823:デフォルトの名無しさん
08/10/09 12:13:24
ん?どんな風に?
824:デフォルトの名無しさん
08/10/09 18:45:20
質問です。
Haskellにて、二次元配列を時計回りに90度回転させるには、どうすればいいでしょうか?
今あるコードが
rot90 list = reverse (map (head) list) : rest
where rest = if length (concat taillist) == 0 then []
else rot90 taillist
where taillist = map tail list
ですが、ものすごく非効率的だと思います。
825:デフォルトの名無しさん
08/10/09 19:03:11
>>824
length (concat taillist) == 0
の部分を
all null taillist
にでもすれば別に非効率的でもない気がする
俺ならtransposeを使うな
rot90 = transpose . reverse
826:デフォルトの名無しさん
08/10/09 19:24:00
>>825
素早い回答ありがとうございます。
実は、transposeも定義しないといけなく、transposeでrot90を使っているので…。
transpose list = rot90 (hflip list)
hflip list = reverse list
というふうになっております。
827:デフォルトの名無しさん
08/10/09 19:39:20
どうしてもrot90でtransposeを定義しなきゃいけないの?
そうでなくて単にtransposeが必要ってだけならその定義は捨てて
import Data.Listしてtransposeを使えば良いんじゃない?
828:デフォルトの名無しさん
08/10/09 19:45:38
transposeって標準の関数ではないんですか?
829:デフォルトの名無しさん
08/10/09 19:53:59
>>827
課題では、自分でtransposeを定義しろ、とのことでした。
830:デフォルトの名無しさん
08/10/09 20:20:13
>>828
Prelude関数ではないのでData.Listをインポートしないと使えない。
>>829
だったら >>825 が最初に言ってる変更をするか、rot90を使わずにtransposeを定義すれば。
831:デフォルトの名無しさん
08/10/09 21:12:45
Data.Listのtransposeはこれ
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([] : xss) = transpose xss
transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : transpose (xs : [ t | (h:t) <- xss])
832:デフォルトの名無しさん
08/10/10 06:57:02
>>813
連続した半角スペースはjavascriptモードで書き込むときに置換されるらしい。
>>824-825
長方形じゃないときに、all だとエラー、any だと長方形になるように切り落とす。
filter 使えば>>831の transpose に map reverse . したような感じになる。
([<h or t> | h:t<-xss] = map <head or tail> (filter (not.null) xss))
違ったやり方なら
rot90 = foldl c []
where
c yss [] = yss
c [] xs = [[x] | x<-xs]
c (ys:yss) (x:xs) = (x:ys) : c yss xs
とか。
833:デフォルトの名無しさん
08/10/10 07:01:54
あ、any じゃ list == [] のときまずいという話もあるか。
834:デフォルトの名無しさん
08/10/11 00:49:41
>>823
パッケージの管理方法にいろいろと問題がある。
835:デフォルトの名無しさん
08/10/11 01:26:24
>>834
具体的に言ってくれよ。そして開発者達にも。
836:デフォルトの名無しさん
08/10/27 20:53:56
質問です。ディレクトリの階層構造をData.Tree型に納めようとしてい
るのですが、遅延評価が効くようなコードが書けません。
type FileTree = Tree FilePathとして、以下のような関数を作ってみたのですが。
recursiveFileTree :: FilePath -> IO FileTree
recursiveFileTree name = do
contents <- catch (getDirectoryContents name) (\e -> return [])
children <- let
filtered = filter filterDots contents
pathadd = map (\x -> name </> x) filtered
mapped = map recursiveFileTree pathadd
in sequence mapped
return (Node (takeFileName name) children)
where filterDots :: FilePath -> Bool
filterDots "." = False
filterDots ".." =
filterDots _ = True
(インデントしてるように見せるために全角スペースを入れています。見えますか?)
おそらくsequenceで[IO FileTree] -> IO [FileTree]としているあたりが問題なのだと思いますが、解決策が分かりません。
837:デフォルトの名無しさん
08/10/27 22:14:59
・unsafeInterleaveIOを使う
・Data.Treeを使うのをやめて、明示的なIOを伴う木を定義して使う
好きな方を選んでくれ
838:デフォルトの名無しさん
08/10/27 22:22:13
一応言っておくが、HaskellのIOは基本的に遅延しないし、普通はそれで正しい
IOは実行順が重要なことが多く、遅延させて順番をうやむやにすると厄介なことになりやすい
それだとどうしても不便というときのためにunsafeInterleaveIOがある
839:デフォルトの名無しさん
08/10/30 10:12:08
f a b c の部分適用として f a b と書くことはできますが、(\a -> f a b c) にあたる部分適用を a を省略して書く方法はありますか?
840:デフォルトの名無しさん
08/10/30 11:26:17
flip使え
841:デフォルトの名無しさん
08/10/30 17:56:42
flip (flip f b) cはさすがに悪趣味だろ
842:デフォルトの名無しさん
08/10/30 18:02:48
(\a -> f a b c) → 15文字
flip (flip f b) c → 17文字
843:デフォルトの名無しさん
08/10/30 19:39:38
($c).($b).f flip (`f`b) c
844:デフォルトの名無しさん
08/10/30 19:45:59
こんなのもありました。
(flip.(flip f)) b c
3引数flip
URLリンク(haskell.g.hatena.ne.jp)
845:デフォルトの名無しさん
08/10/30 19:54:21
>>844 は >>841 の変形だね。
あと、内側の括弧は無くてもOK
846:デフォルトの名無しさん
08/10/30 21:45:30
f # b c みたいな構文(# は未適用引数を表す)があったら便利だったかもね
847:デフォルトの名無しさん
08/10/30 23:03:15
SRFI 26 みたいな?
848:デフォルトの名無しさん
08/10/30 23:47:19
\x->f x b c
849:デフォルトの名無しさん
08/10/31 08:29:54
>>848
>>839
850:デフォルトの名無しさん
08/10/31 11:19:22
>>846
それだと
f # b c -- \a -> f a b cと同等
と
(f #) b c -- (\a -> f a) b cと同等
を区別する必要が出てきて面倒だな
851:デフォルトの名無しさん
08/11/02 13:03:16
URLリンク(d.hatena.ne.jp)
ブログ持ってないのでここで。酒井さんのパクリ。
{-# OPTIONS -fglasgow-exts #-}
import Control.Monad (liftM2)
import Data.Either
import Test.QuickCheck
infix 4 :<->:
type a :<->: b = (a -> b, b -> a)
(.>) :: a:<->:b -> b:<->:c -> a:<->:c
(f1,g1) .> (f2,g2) = (f2 . f1, g1 . g2)
un :: a:<->:b -> b:<->:a
un (f,g) = (g,f)
type a :+: b = Either a b
infixr 5 :+:
alt :: a:+:b :<->: b:+:a
alt = (f,f) where f = either Right Left
swap :: a:+:b:+:c :<->: b:+:a:+:c
swap = (f,f) where f = either (Right . Left) (either Left (Right . Right))
rt :: b :<->: c -> a:+:b :<->: a:+:c
rt (f,g) = (r f, r g) where r = either Left . (Right .)
852:デフォルトの名無しさん
08/11/02 13:04:16
data T = L | N T T deriving (Eq, Show)
fold :: a:+:(T,(T,a)) :<->: (T,a)
fold = (f,g)
where
f (Left a) = (L,a)
f (Right (t1,(t2,a))) = (N t1 t2,a)
g (L,a) = Left a
g (N t1 t2,a) = Right (t1,(t2,a))
h :: (T,a) :<->: a:+:(T,a):+:(T,(T,(T,a)))
h = un fold .> rt (un fold)
s :: a:+:(T,(T,(T,a))) :<->: (T,a):+:(T,(T,(T,(T,a))))
s = rt (un fold .> alt) .> swap .> rt fold .> alt
853:デフォルトの名無しさん
08/11/02 13:05:44
st :: (T,a) :<->: (T,(T,(T,(T,(T,(T,(T,a)))))))
st =
-- T
h
-- 1 + T + T^3
.> swap
-- T + 1 + T^3
.> rt (s .> s .> s .> s
-- T + T^4 + T^7
.> alt)
-- T + T^7 + T^4
.> swap
-- T^7 + T + T^4
.> rt (s .> s .> s .> s .> s)
-- T^7 + T^6 + T^9
.> swap
-- T^6 + T^7 + T^9
.> un h
-- T^7
854:デフォルトの名無しさん
08/11/02 13:08:02
instance Arbitrary T where
arbitrary = oneof [return L, liftM2 N arbitrary arbitrary]
main :: IO ()
main = do
quickCheck $ \x -> x == (snd st (fst st x) :: (T,()))
quickCheck $ \x -> x == fst st (snd st x :: (T,()))
型検査で漏れてるのは fold の定義ぐらいで、QuickCheck 意味ないのかも。
855:デフォルトの名無しさん
08/11/03 11:50:00
すげえ、読みやすいな
856:デフォルトの名無しさん
08/11/05 07:40:02
GHC 6.10.1リリースあげ
857:デフォルトの名無しさん
08/11/05 08:34:43
((f.) . g) a b
みたいなテクニックが沢山載ってるようなページを教えてください
858:デフォルトの名無しさん
08/11/05 12:06:08
unsafeInterleaveIO :: IO a -> IO a
unsafeInterleaveIO (IO m)
= IO ( \ s -> let
r = case m s of (# _, res #) -> res
in
(# s, r #))
この#って何なんですか?ghc6.8.2ではエラーになりますし…
859:デフォルトの名無しさん
08/11/05 12:38:02
>>858
unboxed tupleってやつだね。
URLリンク(itpro.nikkeibp.co.jp)
>>856
Windows版を入れてみたんだけど、ライブラリの置き場所がキモイな。
6.8だと$topdir/lib以下に入ってたのが6.10.1だと$topdirに入ってる。
キモイし$topdirの見通しも悪いので6.8と同じように$topdir/libの中に移動して
package.confの中の$topdir\\を$topdir/lib\\に全置換した。
860:デフォルトの名無しさん
08/11/05 14:29:51
>>859
ありがとうございました
拡張構文なんですね
861:デフォルトの名無しさん
08/11/06 23:45:00
weakリダクションって何?
862:デフォルトの名無しさん
08/11/08 00:10:49
googleで検索したらひっかかったので、ここに書かせていただきます。質問していいでしょうか?
Haskellの処理系だけを使って、prologみたいなことができないか調べています。
↓でprologのタプル parent(tom, bob). のような感じにすると、
parent::[Char]->[Char]->Bool
parent "tom" "bob" = True
parent "liz" "bob" = True
parent "mike" "liz" = True
parent _ _ = False
とりあえず、
main = print $ parent "tom" "bob"
main = print $ parent "mike" "bob"
で True や False が出て、prologっぽくなります。
そこで、
parent X "bob"
という質問に対し、
X=tom
X=liz
みたいに変数にユニファイするような定数を手に入れるような仕組みってあるでしょうか?
入門書に、コンパイル時に内部でグラフを作るみたいな話が書いてあったので、
そのグラフを参照できるようなことができれば実現できると思うのですが、無理でしょうか?
863:デフォルトの名無しさん
08/11/08 00:23:23
>>862
無理
Haskellの関数は文字通り関数なので、引数を放り込んで結果を観察する他に使い道は無い
864:デフォルトの名無しさん
08/11/08 00:43:20
中間形式のグラフみたいなの見れないのん?
865:デフォルトの名無しさん
08/11/08 01:15:29
中間形式のグラフって何?
グラフ簡約のことを言ってるのなら、グラフが作られるのは実行時だし、
要するに「未評価の式」を表してるだけだから、それを見ても>>862みたいなことをする助けにはならんよ
866:デフォルトの名無しさん
08/11/08 01:27:35
少なくとも書こうとしてるプログラムの中からは見れない。
Haskellって厳格な言語で、その手の変なことは基本的にできないよ。
何をやりたいのか知らないけど、インタプリタ的なものを書いて、
それをライブラリとして使えば?
867:デフォルトの名無しさん
08/11/08 01:38:05
ん、普通にMaybeとかそれ以前にListモナドとか使えば普通に実現出来るって云うかモナドのすべて読んだ方が良いと思うよ
868:デフォルトの名無しさん
08/11/08 02:16:43
関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照するという話と、
先にグラフを作って、実行時に、そこにデータを流し込むような感じの説明があったから、
処理系をそのまま利用して、かなり高速なデータベースが作れると思ったんですけどダメですかね。
実現できればprologよりも表現能力が高いから面白そうだと思ったんですが。
869:デフォルトの名無しさん
08/11/08 03:27:38
>関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照する
これはその通り
>先にグラフを作って、実行時に、そこにデータを流し込む
これはぜんぜん違う
多分どこかで誤読してると思う
870:デフォルトの名無しさん
08/11/08 11:40:05
>>867
zs <- everything
append [1..100] [1..100] zs
こういうやり方じゃ生きてるうちに終わらないかもよ。
Listモナドは、もちろんユニフィケーションや制約伝播なんて無くて、
総当りで解を求めようとする非決定性計算ってだけなんで。
871:デフォルトの名無しさん
08/11/08 11:50:02
yet another embedding of pure Prolog into Haskell
URLリンク(okmij.org)
いまいち使い方はわからんけど、ググったら見つかったので貼っておく。
872:デフォルトの名無しさん
08/11/08 20:48:35
>>870
failや[]で枝狩り
873:デフォルトの名無しさん
08/11/09 00:44:22
>>872
変数をどう表現して、何をどう枝刈るの?
874:デフォルトの名無しさん
08/11/22 08:25:24
887 名前:デフォルトの名無しさん[] 投稿日:2008/11/22(土) 00:28:37
Real World Haskellは糞本だと思う
875:デフォルトの名無しさん
08/11/23 12:49:16
出版されたの?
876:デフォルトの名無しさん
08/11/25 23:01:38
出版されたかは知らないけど訳してる人がいる
URLリンク(d.hatena.ne.jp)
877:デフォルトの名無しさん
08/11/25 23:27:23
始まったばかりにしても、ひでえ訳
878:デフォルトの名無しさん
08/11/25 23:41:58
Real World Haskellって翻訳本が出ると思いますか?
マイナーな言語だけど、微妙にブームになってるし
来年ぐらいに出版されたりするかなあ?
879:デフォルトの名無しさん
08/11/25 23:48:26
確かに一時期あったけど、とっくに沈静化したような…>ブーム
880:a36 ◆K0BqlCB3.k
08/11/25 23:50:52
>>879
最近は沈静化したように見せかけて、ジワジワきてるよ。
各大学の卒研レベルではHaskellやったりしてるところが増えてきてる。
881:デフォルトの名無しさん
08/11/26 00:04:13
うーん、訳の出来とは別になんか期待できなさそうな感じ
882:a36 ◆K0BqlCB3.k
08/11/26 00:08:27
原文自体平易な英文なので今後のことを考えるなら英文に慣れるために原文で読むことをお勧めします。
883:デフォルトの名無しさん
08/11/26 00:12:16
まだ10章までしか読めてないけど
ふつケルの次くらいに読む分には悪くないと思う>RWH
タダだし
884:デフォルトの名無しさん
08/11/26 00:17:39
本買おうと思ったけど、WEBで読めるわけだし
翻訳本が出るまでそれですまそうかなw
885:デフォルトの名無しさん
08/11/26 00:19:34
RWHクソだろ~
11章からはページを増やすためにネタを書きましたって
レベルのオナねたのオンパレードだぞ
886:デフォルトの名無しさん
08/11/26 00:36:34
RWHってネットでもう出回ってるんだなw
887:デフォルトの名無しさん
08/11/26 00:45:56
出回ってるつーかあれを最近本にしたんでしょ?
888:デフォルトの名無しさん
08/11/26 00:49:09
存在型ってなんですか?
889:デフォルトの名無しさん
08/11/26 01:23:56
バキシルとか大麻のことだ
890:デフォルトの名無しさん
08/11/26 01:48:33
ありがとうございます。
891:デフォルトの名無しさん
08/11/26 07:48:38
>>888
Cardelli読め
892:デフォルトの名無しさん
08/11/26 13:02:02
Haskell: The Craft of Functional Programming
と
Programming in Haskell
のどちらがお勧めですか?ふつけるの次くらい。
893:デフォルトの名無しさん
08/11/26 21:24:32
>>884
下手糞な翻訳の恐れ大。最近多いね、いや昔からか
894:デフォルトの名無しさん
08/11/26 22:52:49
Programming in Haskellはいいよ。ふつけるの前でもいいです。
895:デフォルトの名無しさん
08/11/27 19:14:12
>>892
自分はふつけるの後にCraftでした。というか、その間にSICPが
あるので、あんまり参考にならないかな。ふつける読んでも
ちょっとピンとこなかったんですね、よくまとまってるとは思うのですが。
自分は普通の文系プログラマで、関数型プログラミングの世界とは
無縁だったので、SICPをくぐる必要があったと感じてます。
896:デフォルトの名無しさん
08/11/27 19:30:50
Craftはいつ第3判が出るのですか?
897:デフォルトの名無しさん
08/11/27 19:55:34
Craft第2版以降で目立ったHaskellの技法というと、Arrowぐらいでしょうか。
あとはReal Worldみたいな実用面を書いたものになりますかね。
898:デフォルトの名無しさん
08/11/27 20:02:06
ガンズのニューアルバムが出るころに出版されるそうです。
899:デフォルトの名無しさん
08/11/28 20:17:32
それは出版されないってのとどう違うのだ
900:デフォルトの名無しさん
08/11/28 22:32:12
泳げる頃にh(ry
901:デフォルトの名無しさん
08/11/28 23:59:30
1版ならともかく3版なら別に出なくてもいいんじゃね
902:デフォルトの名無しさん
08/11/29 00:04:26
Implementing Functional Languages: a tutorial
ってのをやってますが、練習問題の回答とかどっかに転がってますでしょうか。
903:デフォルトの名無しさん
08/11/29 11:25:49
>>902
著者本人が公開してる。あとは自分で探せクズ。
904:デフォルトの名無しさん
08/11/29 11:27:36
>>903
おめーがクズだろ
この引きこもりw
905:デフォルトの名無しさん
08/11/29 21:15:40
自演乙
906:デフォルトの名無しさん
08/11/29 22:05:13
Haskellで書かれた数式処理ソフトがあると聞いたのですが
maximaと比べると
言語から直接利用するときの利用しやすさは、どんな感じなのでしょうか?
907:デフォルトの名無しさん
08/11/30 09:20:37
PJの答を探しているクズ、どこのゼミ生かしらんが、これで次の輪講はアウトだなwww
908:902
08/11/30 09:56:28
>>907
自分では探してみましたが、部分的なコードだけしか見つけられませんでした。
ちなみに、自分は学生ではないんです。輪読の場があったりしたら入りたい
ですけど、ちょっと今は時間的に厳しいかな。ネットでやってたりするといいん
ですが。
909:デフォルトの名無しさん
08/11/30 16:00:41
探すもなにも、入手方法ちゃんと書いてあるじゃんwww
910:デフォルトの名無しさん
08/11/30 21:28:44
>>896
2021年4月19日に出るみたいです。
まだ相当先ですね。
911:デフォルトの名無しさん
08/12/01 20:25:35
どんどん延期してると思ったら
今度はありえないくらいに延ばしたな・・・
912:デフォルトの名無しさん
08/12/07 12:54:19
ghci の補完って windows じゃ効かないんですかね。
Linux 上だとちゃんと動いて便利だったのでショックです。
ネット探してみると rlwrap 使えとかあったけど
rlwrap って動的な補完(スコープ内の関数一覧等)
って可能なんでしょうか。
913:デフォルトの名無しさん
08/12/07 13:54:21
そんな高度な補完はemacsのinferior-haskellとかeclipseの拡張でもできるかどうか怪しいな
914:デフォルトの名無しさん
08/12/07 13:56:28
英語配列30g早く!
915:902
08/12/07 20:05:48
>>909
書いてありました。これって個人でも送ってくれるのでしょうかね。
ただ、まだ半分ぐらいなんですけど、問題簡単なので別に解答不要
になりそうです。ありがとうございました。
916:デフォルトの名無しさん
08/12/13 18:52:49
do記法と(>>=)の対応についてですが、
do;putStr "a\n";putStr "b\n";putStr "c\n";
≡
putStr "a\n" >>= (\_->putStr "b\n" >>= (\_-> putStr "c\n"))
なんですかね?
右結合的になったり匿名関数に変換されたりと難しいです
917:a36 ◆K0BqlCB3.k
08/12/13 19:06:24
>>916
一緒です。
でも
putStr "a\n">>putStr "b\n">>putStr "c\n"
と書いた方がきれいですよ。
918:a36 ◆K0BqlCB3.k
08/12/13 19:06:57
あと、括弧なくても良いですよ。
919:デフォルトの名無しさん
08/12/14 10:36:09
なるほど、そう言えばlambda式ってかなり優先順位が高いんでしたね
ありがとうございました
920:デフォルトの名無しさん
08/12/14 15:42:38
F#からポロロッカしてきました
fold/undold、flip とかを使った関数合成がすげえ苦手なんですが
このあたりに特化した書籍とかってないでしょうか
モナドとか継続とかはわりとどうでもいいんですが
921:デフォルトの名無しさん
08/12/14 16:19:34
プログラムの変形やそこで使う公式を見るのがいいと思う。
birdがそういうの得意な人だから、
Introduction to Functional Programming using Haskell
URLリンク(www.amazon.com)
"Using Haskell"じゃない前の版の方がその辺は内容が濃かった。
The Algebra of Programming
URLリンク(www.amazon.com)
は関数合成、変形ドリルみたいな内容だった。
たしかparserを必要な機能を持つように変形する論文もあったはず。
922:デフォルトの名無しさん
08/12/14 17:06:40
undoldって何かと思ったけど、unfoldの間違いだよね?
923:920
08/12/14 17:19:51
間違いですw
>>921
ありがとう
Introduction~とRealWorldHaskellをぽちってみました
下は高杉…
924:デフォルトの名無しさん
08/12/15 17:13:13
yet another haskell tutorialの4.6で
cfold' f z [] = z
cfold' f z (x:xs) = f x z (\y -> cfold' f y xs)
という継続fの与え方次第でfoldlにもfoldrにもなるものが出てきたんですが
普通のfoldlやfoldrの定義からこれを導きだす手順のようなものがあるなら知りたいです
また「なんでも再帰」流に一つ引数増やして、最後にそれを必ず呼び出すようにして
末尾再帰の形に直していく…ってやり方で書こうとしてますがさっぱりです
925:デフォルトの名無しさん
08/12/16 12:48:15
面倒だからfactorialで書くと、
fac 0 = 1
fac n = n * fac (n-1) なのか
fac n = fac (n-1) * n なのかってことだから、
fac n = ((n *) . fac) (n-1)あるいは、
fac n = ((* n) . fac) (n-1)
fac n = (((\m ->(m *)) n) . fac) (n-1)あるいは、
fac n = (((\m ->(* m)) n) . fac) (n-1)
fac0 f n = ((f n) . (fac0 f)) (n-1)で
fac0 (\m ->(m *)) nあるいはfac0 (\m ->(* m)) n
\m ->(m *)と\m ->(* m)は、
fac(n-1)を計算した後にすべき計算、つまり継続になっています。
926:デフォルトの名無しさん
08/12/16 12:51:01
要するにfoldってのは累積を計算しているのだから、
その累積演算を関数に独立させると、foldの性質上、継続的になるのです。
mapだとこうはなりません。
927:デフォルトの名無しさん
08/12/16 22:40:24
>>926
ところがどっこい、この説明のすぐ後で、
「CPSを使ってmapとfilterを書け」なんて演習問題が出されてるわけですよ。
それを考えると、foldlの定義からcfold'へ持っていってあげたほうが
親切かもしれません。
928:デフォルトの名無しさん
08/12/16 22:53:36
あっと、「この説明」ってのは
「yet another haskell tutorial の cfold' の説明」のことね。
929:デフォルトの名無しさん
08/12/16 23:38:03
>>927
cfold'は、元のfold*の引数に渡す演算自体が継続的になるのに対して、
mapでは引数に渡す演算ではなくて、:が継続的になるわけです。
だからYAHTでは微妙に表現を変えています。
map f = foldr (\x -> ((f x) :)) []
ですから当たり前ですけども。
930:デフォルトの名無しさん
08/12/19 19:38:36
>>929
すまん、「継続的」という言葉の意味がさっぱり分からん。
CPSにしたときに最後に行われる計算、という意味なら、
foldlは「foldl」自体が継続的、
foldrは引数として渡す関数「f」が継続的ということになるので、
fold*で継続的となる関数が同じになるとは思えない。
931:デフォルトの名無しさん
08/12/21 19:58:16
おそらく激しいFAQだとは思うのですが、日本語の扱いについて。
Charの仕様からして、 >>5の「i. CharをUnicodeとして扱う」が筋と思いますが、
リテラルはともかく、IOでの変換のスタンダードな方法はもう固まってきてるでしょうか。
URLリンク(blog.kfish.org) によると、
メジャーな方法が3つあるらしいですが、どれか、もしくはどれかがdefactoになっているでしょうか。
Haskell'でも使えるのがいいですが…。
932:デフォルトの名無しさん
08/12/21 22:14:48
utf8-stringっぽいかな‥‥