他人のHaskell日記 RSSフィード

Haskell初心者が、リハビリがてらに「ふつける」と「入門Haskell」片手に、試行錯誤するサイト。

2008-12-29

Programming in Haskellの12章の自分なりのまとめ。 Programming in Haskellの12章の自分なりのまとめ。 - 他人のHaskell日記 を含むブックマーク

Introduction

状態のある言語では評価の順序が変わると大変な事になっちゃう。でも「純粋」な言語では、評価の順序は、引数が関数に適用されたときの返り値に、まったく影響を与えない。しかし、それでも評価の順序は意味があるんだよ。

Evalution Strategie

関数適用によって簡約できる「ひとつ以上の引数に適用されてる関数の形 (例:div 6 2)」を簡約可能式、略してredexと呼ぶ。簡約が式のサイズを変化させるとは限らない、けど実際は簡約で式のサイズが減るのはよくあること。

redexを簡約していく順番を決める戦略には二つある。

ただしHaskellのbuilt-inの関数 + *とかは、引数を先に評価する。(後で議論するけど)こういうの関数の性質を正格と呼ぶんだ。

lambda expression

Haskellではlambda式の中のredexに触れることは禁止されている。lambda式の中はブラックボックスで触れない。許されるlambda式への操作は、引数の適用だけ。適用して,中身を取り出してはじめて中のredexに触れる。

  • lambda式の中以外での最内評価をcall-by-valueと呼ぶ。
  • lambda式の中以外での最外評価をcall-by-nameと呼ぶ。

この二つの違いを「終了の仕方」と「簡約ステップ数」について見ていこう


Termination

inf = 1+inf

評価戦略に関わらず、この式は終わらない。

fst (1,inf)

この式は、call-by-valueだと終わらない。call-by-nameだと終わる。


More generally,we have the following important property:if there exists any evaluation sequence that terminates for a given expression,then call-by-name evaluation will also terminate for this expression,and produce the same final result.

In summary,call-by-name evaluation is preferable to call-by-value for the purpose of ensuring that evaluation terminates as often as possible.

call-by-nameで終わる時はcall-by-valueでも終わる。call-by-valueでしか終わらない場合がある。つまり、その点ではcall-by-valueの方が優れてるって事。

結論:遅延評価なら、理論的に終了できるなら終了する。

Number of reductions

call-by-valueは引数が一度しか評価されない。call-by-nameでは引数がコピーされてから評価されることがあるので、同じ引数が何度も評価されうる。簡約のステップ数はcall-by-nameの方が多くなるかもしれない。しかしHaskellは、引数の評価が一度しかされないような戦略を取っている。

コピーされるのは引数そのものではなくて、引数へのポインタであって、引数の評価は一度で済むようになっている(グラフ簡約)。このような評価戦略を遅延評価とかcall-by-needとか言う。

lazy evaluation never requires more steps than call by value evaluation

結論:遅延評価は、call-by-value評価よりもステップが多くなったりはしない。


Infinite structures

遅延評価のおかげで無限の構造を持つデータが扱える。

using lazy evaluation,rxpressions are only evaluated as much as required by the context in which they are used.

「ones = 1:ones」で定義されるようなデータは「無限リスト」というよりは潜在的無限リストであって、コンテクストが必要とされる部分だけが評価されるんだ。

Modular Programming

lazy evaluationのおかげでデータとコントロールを分離できる。

これはモジュラリティという有り難い特性を産んでくれる。

Strict Application

Haskell遅延評価が基本だけど、関数適用正格にもできる。

例えば、(f $! x)では、xをトップレベルの評価をしてからfが適用される。

遅延評価はときおりサンクを積み上げるので、正格適用はスペース節約に便利。

foldlの正格版のfoldl'は便利かもしれない。

however strict application is not a silver bullet that automatically improves the space behavior of Haskell programs.Even for relatively simple examples,the use of strict application is a specialist topic that requires careful consideration of the behavior of lazy evaluation.

(しかしながら正格適用は鋼の弾丸にあらず、自動的にHaskellプログラムのメモリを扱う振舞いを改善したりはしない。比較的単純な例でさえ、正格適用は専門的な議題であり、注意深い配慮を遅延評価の振舞いへと払わなくてはならない。

という事なので必要になるまで手を出さない方が良さそうだ。

2008-12-24

memo memo - 他人のHaskell日記 を含むブックマーク

圏論でのモナドを構成する三人組と、それに対するApplicative,Functorでの対応

関手(map) 単位(unit) 乗法(flatten)
(a -> b) -> (m a -> m b)a -> ma m (m a) -> m a
Functor fmap
Applicative <$> pure
Monad liftM return join

Functor Laws

 fmap id  ==  id
 fmap (f . g)  ==  fmap f . fmap g

Applicative Laws

--identity
    pure id <*> v = v 
--composition
    pure (.) <*> u <*> v <*> w = u <*> (v <*> w) 
--homomorphism
    pure f <*> pure x = pure (f x) 
--interchange
    u <*> pure y = pure ($ y) <*> u 

Monad Laws

 return a >>= k  ==  k a
 m >>= return  ==  m
 m >>= (\x -> k x >>= h)  ==  (m >>= k) >>= h

Haskell generally uses a pair of functions called return and bind (>>=), but it is more natural sometimes to begin with map (fmap), return and join

(訳:Haskellは一般にreturnやbindと呼ばれる関数のペアを使うが、map(fmap),return,joinからはじめたほうがより自然である。)

no title

Monad は操作の積の抽象化ともいえる. 任意の a, b について、自然な (>>=) :: m a -> (a -> m b) -> m b が与えられるということは、任意の a について自然な m m a -> m a が与えられることと同値になる.これが積の正体. 2重配列を1重に直す Array#flatten は、この手の積の一例.

no title


モナドの勘所 モナドの勘所 - 他人のHaskell日記 を含むブックマーク

http://d.hatena.ne.jp/m-hiyama/20060421/1145613700

http://d.hatena.ne.jp/m-hiyama/20060418/1145322223

ここを見ながらお勉強。少しだけモナドに親しくなれた気がする。

概要

  • どんな関数も「(1段の)モナド」を返す関数に変換できるよ。
  • モナドを返す関数」同士を合成して「モナドを返す関数」にできるよ。
  • その合成には結合律が成り立つよ。
  • 結合律はモジュール性を産むよ。

いきなり脱線:無視しましょう。

普通、圏論で使われるのは、Haskellで言うところの(=<<)であるが、Haskellは(>>=)の方を優遇している。これはflip(=<<)なので意味的には同じで引数の順番が違う。(>>=)が優遇されているのは、流れを左から右にしたいからであろう。そうすれば、シンタックスシュガーであるdo記法に書き換えたときに、処理を上から下に書ける命令的スタイルと相性がいいのである。

普通の関数適用で考えてみよう。f (g (a))という関数があったとき、流れは右から左になっている。

次の関数で考える。

hoge = blur $
       fizz $
       buzz $
       bar  $
       a

このときabar適用され,それにbuzz適用され,それにfizzが適用され,blur適用され、という風に流れが下から上になっている。($$)をflip($)で定義し、結合性優先順位を適切に設定すれば、

hoge = a    $$
       bar  $$
       buzz $$
       fizz $$
       blur

と書ける。こうすれば流れは上から下になってくれる。そういう事がしたいのでHaskellでは(=<<)より(>>=)を選んだと思われる。

さて、そういうHaskellの都合は無視しよう。

今ここにHaskellにおける関数(=<<),returnが存在するとする。

これらは圏論の用語ではそれぞれextとunitと呼ばれる。この二つと型構成子mを合わせてKleisli tripleと呼び、モナドの定義に使われる。

具体的には、次のモナド則を満たさなければならない。

   1.  (return x) >>= f == f x
   2. m >>= return == m
   3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)

圏論のモナドの定義には代数スタイルという別の手段があり、それは(unit,fmap,join,型構成子)を元に作られる。(下の方で、Kleisli tripleからfmap,joinを作れる事を議論する。)


モナドと関係の無い普通の関数「f::A -> B」を仮定する。

この関数に「unit::a -> m a」を後合成することで「unit.f::A-> m B」の形の関数を得られる。

型が「(ほにゃらら)-> m (なんたら)」な関数をM resulticな関数と言う。要するにモナドを返す関数である。

普通の関数はunitと後合成することでM resulticな関数に出来る

  • 圏論の議論より、M resulticな関数「(ほにゃらら)->m a」はext(=<<)を適用することで、お尻を持ちあげられる。つまり「m(ほにゃらら)→ m a」となる。

与えられたm a型の値をそのまま返す関数id::m a -> m a は「(ほにゃらら)-> m a」の形になっているのでM resulticである。M resulticな関数のお尻は持ちあげられるのでやってみると「id^:m(m a) -> m a」という形になる。

こいつがjoinの正体であり、Listのconcatの正体でもある。この関数を使えば多重なmを一段減らせる。

mが多段になっていたとしても(Maybe Maybe Maybe Maybe Maybe Maybe Int)、何度も適用すれば最後には1段まで落とせる(Maybe Int)

extからjoinが作れる。そしてjoinを使えばどんなモナドも1段まで落とせる。

  • 圏論の議論より、M resulticで無い関数「(ほにゃらら)→a」にextは適用できない(お尻だけ持ちあげることはできない。)

ということは、extを使って「(ほにゃらら)->X」から「m(ほにゃらら)->X」を作ることができないという事を意味する。(unitを使っても無理である。)今作るのに断念した「m(ほにゃらら)->X」は、モナドを外す関数である。つまりモナドの外側をはいで1段のモナドまで落とすことはできても、最後のmを脱がせるようなモナド的な操作は存在しない。 「モナドには出口が無い」というのは、そういう意味である。

2つのM resulticな関数を合成し、1つのM resulticな関数を作れる.f:X→m Y とg:Y→m Zという関数があったとする。まずgのお尻を持ちあげてg^:m Y-> m Zという関数を作る。fの値域とg^の定義域は同じm Yなので、この二つは合成できる。その結果、g^.f:X->m Z が出きる。この2つのM-resulticな関数の合成をKleisli Compsitionと呼ぶ。

Control.Monadではモナド合成演算(Kleisli composition演算子)は次のように定義されている。

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
m >=> n = \x -> do { y <- m x; n y }

(訳注:これを変形する。

m >=> n = \x ->  m x  >>= \y->n y -- シンタックスシュガー外し 
m >=> n = \x ->  m x  >>= n       -- ポイントフリー
m >=> n = \x ->  n    =<< m x     -- (=<<)はflip(>>=)
m >=> n = \x ->  (=<<) n  (m x)   -- 演算子は関数
m >=> n = \x ->  (ext n)  (m x)   -- 議論にあわせてextに書き換え。nを部分適用
m >=> n = \x ->  (ext n.m) x      -- 関数合成
m >=> n = ext n.m                 -- ポイントフリー

上で議論した形になった。

ところで、

a >>= b >>= c >>= d >>= e >>= f

a >>= (b >=> c >=> d >=> e >=> f)

と意味的に一緒である。>>=がやってるのは「b,c,d,e,fを合成した関数」のお尻を持ちあげて(拡張)aという座薬を入れる(適用)しているイメージである。

)

この演算子を使えば、Monad則は次のように書き換えられる。

  • "Left identity": return >=> g = g
  • "Right identity": f >=> return = f
  • "Associativity": (f >=> g) >=> h = f >=> (g >=> h)

いまや、モナド合成が結合律を満たすのは明らかだ

no title

手動の型推論により、return:a -> m a、f:a -> m b、g:b -> m a、h:a -> m c のはずなので

  • a-> m a >=> a -> m b = a -> m b
  • b -> m a >=> a -> m a = b -> m a
  • (a -> m b >==> b -> m a ) >=> a -> m c = a->m b >=> ( b -> m a >=> a-> m c )

と書き換えることが出来る。

return を one,>=>を *** と書き換えると

one ***   g = g
f   *** one = f
(f *** g) *** h = f *** (g *** h)

掛算のように見えてくる。これを M-resulticな関数は、Kleisli compositionについて、unitを単位元とするモノイドになっていると表現する。(訂正:型が合致しなければならない制約があるために、正確にはモノイドでは無いそうです)


ところで、

X->YからX->m Y
-あるM-resulticでない関数にunitを後合成すると、頭を持ち上げたM resulticな関数が作れる
X->m Yからm X->m Y
M resulticな関数にextを適用すると、お尻を持ちあげた関数が作れる

この二つの操作を組み合わせればX->Yの全身を持ちあげたm X->m Yが作れる。こいつをmapと呼ぶ。これはHaskellではFunctorクラスのfmapであり(ちなみに、Haskellのリスト関数であるmapをfmapに全て置換しても、そのまま動く。)、MonadクラスのliftMである。

ここでついにjoinに続いてfmapを作ることができた。つまり(unit,fmap,join,型構成子)が揃ったことになる。つまりKleisli tripleで代数スタイルは表現できるということだ。

  • (a-> ____ b) (___にはmが0個以上並んでいるとする)という関数は、なんでも a-> m bという形に出来る
    • a-> b を a-> m bに出来る。(unitを後合成)
    • a-> m......m b (たくさんmが並んでいると考えて。)を a ->m bに出来る。(joinとextを使う)
  • ( )-> m ( )という形の関数同士をKleisli Compositionで合成し、型が( )-> m ( )の形になるようなひとつの関数にできる
結合律とモジュール性

上で、「モナドを返す関数はKleisli Compositionについてモノイド」になっているという事、かけ算にそこが似ている事を述べた。逆に言えば、かけ算について考えることはモナドについて考えることにもなる。

かけ算は結合律をみたす

A * C * C * D * C * C * F * C * C 

これは

A * (C * C) * D * (C * C) * F * (C * C)

と同じである。こう書けるのは結合律のおかげである。

割り算は結合律が働かない。

120 /  2/ 3 / 4 =  5
120 /( 2/ 3)/ 4 = 45

C*Cを3回計算しているので、ここを「モジュール」としてくくりだそう。

C2 = C*Cとする。そうすれば次のように書ける。

A * C2 * D * C2 * F * C2

これが結合律の力である。

さらにモジュールに出来る。

C2 = C*C
(A * C2) * (D * C2) * (F * C2)

f(n) = n * C2 と定義する。

C2=C*C
f(n) = n * C2
f(A)* f(D) * f(F)

これと全く同じ事がモナドにも言える。

モナド則の結合律のおかげで、モナドを返す関数(M-resultic)の組み合わせ(Kleisli Composition)は、その一部を取り出して自由にモジュールにできる。そして、(まだ僕には)なぜかは良くわからないが、いろんな処理がモナドで表現できるのである。それはつまり、いろんな処理を自由にモジュールに分割できる、という事である。

main = do uguu
          gao
          poka
          anpan
          gao
          poka

は次と同じで

air = do gao 
         poka

main =  do uguu
           air
           anpan
           air

これは次と同じである。


crossworld kuchiguse = do kuchiguse
                          air

air = do gao 
         poka

main =  do crossworld uguu
           crossworld anpan

こんな事が出来るのは結合律のおかげである。


かけ算についての上のモジュール性の議論を、実際にHaskellを使って真似てみよう。

a = 5
d = 10
f = 8
c = 3

ret :: Int->Int 
ret n = n

(>>>=):: Int->(Int->Int)->Int
a >>>= f = f a 

multiply :: Int->(Int -> Int)
multiply a b = (a*b)


data MyInt = MyInt Int deriving (Show,Eq)

--A * C * C * D * C * C * F * C * C 
ans = ret 1      >>>=
      multiply a >>>=
      multiply c >>>= 
      multiply c >>>= 
      multiply d >>>= 
      multiply c >>>= 
      multiply c >>>= 
      multiply f >>>= 
      multiply c >>>= 
      multiply c  


-- A * C2 * D * C2 * F * C2    
c2 = \n-> ret n >>>= multiply c>>>= multiply c

ans2= ret 1      >>>=
      multiply a >>>=
      c2         >>>=
      multiply d >>>= 
      c2         >>>=
      multiply f >>>= 
      c2         


--f(A)* f(D) * f(F)

fun x = \n-> ret n >>>= multiply x >>>= c2

ans3= ret 1       >>>=
      fun a       >>>=
      fun d       >>>=
      fun f       

実行結果

*Main> ans
291600
*Main> ans2
291600
*Main> ans3
291600

恒等モナドを使って書き直す。

import Control.Monad.Identity
a = 5
d = 10
f = 8
c = 3

multiply :: Int-> (Int -> Identity Int)
multiply a b = return (a*b)

--A * C * C * D * C * C * F * C * C 
ans = return   1 >>=
      multiply a  >>=
      multiply c  >>= 
      multiply c  >>= 
      multiply d  >>= 
      multiply c  >>= 
      multiply c  >>= 
      multiply f  >>= 
      multiply c  >>= 
      multiply c  

c2 = multiply c >=> multiply c

-- A * C2 * D * C2 * F * C2    
ans2= return 1   >>=
      multiply a >>=
      c2         >>=
      multiply d >>= 
      c2         >>=
      multiply f >>= 
      c2         

fun x = multiply x >=> c2


--f(A)* f(D) * f(F)
ans3= return 1    >>=
      fun a       >>=
      fun d       >>=
      fun f       

BiancaBianca2012/07/24 08:45Deadly accuarte answer. You've hit the bullseye!

iokinaqiokinaq2012/07/25 02:21eAffTE <a href="http://wnespfgrntru.com/">wnespfgrntru</a>

rzefrqgrzefrqg2012/07/26 00:16awec8R , [url=http://waphzksgulwp.com/]waphzksgulwp[/url], [link=http://xqmarjiugccf.com/]xqmarjiugccf[/link], http://aszaetsvysvt.com/

bcwwspbcwwsp2012/07/26 19:06UvNa0Y <a href="http://iicmmzekucpv.com/">iicmmzekucpv</a>

バイアグラバイアグラ2012/11/29 16:04バイアグラジェネリックのhttp://xn--ed-u41gn1j.net/
バイアグラジェネリックの販売 購入はed通販で。
ED治療薬のバイアグラジェネリックの個人輸入を完全サポート致します。
http://xn--ed-u41gn1j.net/generic100.html
バイアグラジェネリック バイアグラジェネリック通販 バイアグラジェネリック販売

2008-12-23

Haskell プログラミングガイドライン Haskell プログラミングガイドライン - 他人のHaskell日記 を含むブックマーク

http://www.haskell.org/haskellwiki/Programming_guidelinesを読みながらメモ。

  • haddockが読めるように

{- |

Module : <File name or $Header$ to be replaced automatically>

Description : <Short text displayed on contents page>

Copyright : (c) <You> and <Your affiliation>

License : similar to LGPL, see LICENSE.txt

Maintainer : Christian.Maeder@dfki.de

Stability : provisional

Portability : portable

<module description starting at first column>

-}

というフォームから開始せよ

  • 「関数はshort&sweetであるべきで、一つの事しかしちゃならん。1画面か2画面で収めろ。ひとつのことをちゃんとやれ。」
  • ほとんどのhaskellの関数は少ない行数であるべき。巨大なデータ型を扱う(まあ、それ自体を避けるべきだけど)場合のcaseは例外。
  • コードは十分かつ明瞭であれ。読みやすく、予想できる変化に対して保守しやすくせよ。理由がなければ、エキゾチックな言語の使用を無駄づかいするな。
  • インデントの深さは指定されていない。
  • {や;を使うのはやめろ
  • コンパイラーの警告に耳をかたむけろ。型宣言をせよ。シャドウイングや未使用の変数は避けよ。パターンは漏れなくダブリなく書け。ありえないパターンはerror <Module Name> <Function>で埋めておけ。
  • 未使用やコメントアウトされたコードをファイルに残すな。読者が混乱する。
  • case式はたいていdeclaration Styleより望ましい。後者は引数の数や関数名が変わったら面倒だから。
  • expression Style(\ t->~)もお勧めしない。const, flip, curry, uncurry、セクション記法、部分適用を使えばたいてい必要ない。まあでもλを消すためだけに補助関数を使うぐらいならexpressin Styleもいいかもしれない。
  • 末尾の空白は全部消せ
  • タブ文字は空白に置きかえろ。
  • 1行80(できれば75)文字以内に収めるべき
  • 全体のモジュールは400行以内にすべき
  • 名前はcamelCaseで付けろ。qualifiedも使え。
  • 部分関数が前提とする条件が明らかでないのならドキュメントを書け。caseを使うなり、事前のテストをするなりして、前提条件が満さされたときのみに部分関数が呼ばれるようにしろ。特にheadを呼ぶときは気をつけろ。あるいは(もっといい手段として)caseを使うことによってheadの使用を避けろ。caseが嫌ならmaybeを使うことで避けれるぞ。とにかく失敗するパターンについては明白であれ。
  • より複雑な事をしようとしているのなら、型の同義名やタプルより適切なデータ型の方が望ましい。そうすれば、後に型クラスを提供するのも簡単になる。コンパイラーにチェックされないため、長期間一貫した型の同義名を使うのは難しい。
  • クラス束縛はデータ型に対してではなく、そのデータを扱う関数に対して行うこと。
  • リスト内包表記は"Short and Sweet"なときだけ使い、普段はmap filter foldrを使え。後々、リスト以外のデータ構造に変えるときも楽だ。
  • 中置き演算子を使えば括弧を減らせるぞ。$や.は便利だぞ。
  • $の周りには空白を残せ.templete haskellで問題がおきないし。(\t->~)と書かずに(\ t ->~)とかけ。
  • letとwhereの混同とネストを防ぐため、top-levelの補助(auxiliary)関数を使え。ただし、その補助関数をexportするな。exportリストは未使用な関数を発見するのに便利。
  • 同じタスクを何度も書いているのに気がついたら、一般化してコードの複製を防げ。バグがでたら面倒だ。
  • 巨大なレコードを扱うときは、コンストラクターを直接使うべきでない。フィールドの数や順番が変わったとき困る。
  • IO,モナド、純粋なdoを含まない関数を厳密に分割することを試せ。
  • Preludeのintaractは使うな。プログラムが(いつも明白ではない)評価順序に依存しないようにしろ。
  • traceはデバッグのためだけに使え
  • Char. List, Maybe, Monadは階層的モジュール名でimportせよ。
  • SetやMapをimportするときはqualifiedを使え。

モジュールを適切にImportしよう


http://www.haskell.org/haskellwiki/Import_modules_properly

他のモジュールから識別子をimportするときにいろいろやりかたがあるが、見た目ほど便利ではないやりかたもある。


推奨:顕示(explicit) import

import qualified Very.Special.Module as VSM
import Another.Important.Module (printf)

非推奨:匿名(anonymous) import

import Very.Special.Module
import Another.Important.Module hiding (open, close)
スタイル
前者では、プログラムを読んでいるときにprintfやVSM.openを見かけたら、その識別子がどこからやってきているのかわかる。後者では、識別子がVery.Special.ModuleからきたのかAnothoer.Important.Moduleからきたのか、それとも他のモジュールから来ているのか区別できない。grepしても無駄だ。Very.Special.ModuleやAnother.Important.Moduleは他のモジュールを再exportしているかもしれないからだ。
複雑性
後者では、importしているモジュールに新たに識別子が加わったら他のモジュールと名前が衝突するかもしれない。だからimportされているをモジュールをアップデートすれば、あなたのコードを破壊する可能性がある。 Another.Important.Module.openを隠したということは、それを軽視している事を意味するが、モジュールがアップデートするときに、この識別子を取り除いたとき、あなたのimportは失敗する。この識別子はまったく必要ではないのに、貴方を何度も困らせることになる。前者では、このような問題は起きない。
正確性
わたしはかつて、匿名importから顕示importに変更したときに、StorableVectorパッケージのバグを見つけたことがある。このモジュールの関数はnot "byte"ではなくunit "element"を計算しなければならないにも関わらず、Foreign.Ptr.plusPtrがimportされていると分った。これは advancePtrが代わりに使われたに違いない。実際にreverse関数はplusPtrを使っており、これは間違っていた。ある無作法は、1バイトよりも大きなsub-vectorsとelementsを扱ったときにのみ観察される。テストスイートはそれを見逃していた。

:例外:Preludeはこれからも不変であることを意図していいるから、Preludeをimportするときにhidingを使うのは問題ない。しかも何も書かなけりゃ自動的にimportされてしまうわけだから。


単純から複雑に

http://www.haskell.org/haskellwiki/Simple_to_complex

一般に、単純な関数を組みあわせて複雑な関数を作るのはいいアイデアだ。

複雑な関数のスペシャルケースとして単純な関数を作るような戦略は、それ単体では上手くいかない。そのような複雑な関数はそもそも、その関数自身に、いろいろなものを組みあわせていかねれば作れない。これでは関数依存のグラフがもつれてしまい、関数は明確な階層にはならない。

Haskell遅延評価機能があるので、単純な関数から複雑な関数を作るのだという原則を忘れてしまいがちだ。数学者がHaskellを遣う11の理由を見てほしい。そこでは「3次元ベクトルの外積を結果の単一成分が必要とされたなら、二つの3次元ベクトルの外積の計算を自動的に簡潔にしてくれる」という遅延評価の利点が紹介されている。

しかしながら、外積の単一成分を計算することは、2x2行列の行列式を計算するのと同じ意味であり、それ自身が有用なものである。

だから、よりよいコンセプトは、外積を行列に簡約する遅延を使わないで、2x2行列の行列式を計算する明確な関数を記述し、外積の計算の中ではこれを3度呼び出すというものである。


他の悪例は数字の線形代数パッケージMatLabだ。その型階層構造は複素数行列から始まっており、ユーザはそこから更に複雑な型を作れる。つまり、より単純な型は存在せず、実数行列もなければ、複素数、実数、整数、ブールも無い。それらは、複素数行列で表現されなければならない。これはあまり自然ではない。なぜなら、transcendent powers のようないくつかの操作は、行列には簡単には移植できないからだ。たくさんの操作において、入力値が例えば1x1行列として適切な特性を持っているかどうかを実行時にチェックされなければならない。実際に、整数や論理値といった、いくつかの種類が後に追加されたが、それはMatLabの基本となる型と奇妙な相互作用をする。

MatLabの言語デザイナーがやった誤りは次のようなものである。

彼等はMatLabが永遠に線形代数用の特別な目的を持った言語でありつづけると考え、この領域で出会うもっとも複雑な型のみを実装することに決めた。MatLabが成長するにつれて、プログラムを新たな需要(画像のインポート、エクスポート、GUIプログラミング等)に合わせるためにプログラムを拡張したが、ユニバーサルな型についての最初の決定は上手くスケールしなかった。

これをHaskellで真似るのは名案ではない。単純な型を作ることから始め、それを使って複雑なものを作ろう。ライブラリの中核に手の込んだ型を使ってはいけない。もしそうだとしても、それらを可能な限り階層の下に(葉のモジュールに)追いやろう。

型クラスメソッド

Data.Listにある多くのメソッド(map, filter, foldr, (++)等)は、他のデータ構造にも一般化できそうです。なぜ一般化されたもの(すなわち型クラスのメソッド)に置き変えられていないのか?と不思議に思います。

  • まず、説明的な理由がある。 foldrのような、高階関数は初心者には理解しがたいものだ。だから彼等は再起を書くことに執着しがちになる。

Data.List.foldlが隠され、その一般化であるData.Foldable.foldl(要素の型や働く関数が一般化されただけにとどまらず、ユーザが利用するような特定のデータ構造も存在しない)のみが使えるようになったとしよう。そこには、もはや具体的なものは存在しない。あるのは抽象だけである。抽象的な関数を一番良く説明するのは例を使ううことだ。例えば sum xs = List.foldl (+) 0 xs……いまや、List.foldlが必要となってしまった。

  • それと近い理由として、コードの分かり易さの理由がある。mapやfilterを見ればリストが使われていると分かる。プログラムの読者が人間型推論を始める必要はない。関数がJustやリストやライトなどをモナドに応じて返しうるとして、それを使ってIO(Maybe a)を返すようなコードを書いたとしたら、プログラムの読者は、帰り値がIOなのかMaybeなのか推論しなければならず、特定の型を処理したいのならば、それを読者に伝えなければならない。
  • 最後でかつ重大な理由に、型安全とコンパイラとのコミュニケーションがある。もしコンパイラが、特定の型のためにプログラミングしているとコンパイラが知っていれば、より強力に型を検査できるし、より正確なエラーメッセージが出せる

Data.List.filterを一般化してみよう。

filter :: (MonadPlus m) => (a -> Bool) -> m a -> m a
filter p m = m >>= \a -> if p a then return a else mzero

これは良いものだが、Data.List.filterを取り替えるべきでない。 一般すぎるコードを書くとコンパイラの型推論は失敗する、GHCiで上の定義のfilterを持っているときに

Prelude> filter Char.isUpper (return 'a')

と書いたとする。これは、どんなモナドだと特定されるべきだろうか?Maybe?IO?リスト?デフォルトの型に頼るべきか?結局、型注釈を付けるはめになるだろう。

これらは、標準ライブラリのみに起こる問題ではなく、カスタム型クラスを設計するときも考慮に入れられなければならない。Slim instance declarations.を見よ

Haskell programming tips Haskell programming tips - 他人のHaskell日記 を含むブックマーク

http://www.haskell.org/haskellwiki/Haskell_programming_tips

序文

このページではコードが改善されていく例を見ていきます。そこから一般的な法則を会得しようと努めましょう。とはいっても何にでも適用できるわけじゃありませんし、趣味の問題もあるかもしれません。私達はそれを知っていますから「これは議論の対象だ」と全ての項目に付け加えないでください。(代わりに/Discussionになら「これは議論の対象だ」と加えても構いません。そこで一定のコンセンサスが得られたなら、このページの中身が変わります。)


簡潔であれ。

車輪を再発明しないように。

標準ライブラリは、役に立つ機能でいっぱいで、時には多すぎるぐらいです。あなたが既存の機能を書き直すなら、読者は、それと標準の関数との違いは何なのかと惑います。しかし、あなたが標準関数を使用するなら、読者は新しくて、何か役に立つものを学ぶかもしれません。 適切なリストの関数を見つけるのにお困りでしたら、このガイドを用いてください。

http://www.cs.chalmers.se/Cs/Grundutb/Kurser/d1pt/d1pta/ListDoc/


明示的な再帰を避けます。

明示的な再帰は一般には悪くはありませんが、高階関数を使った、より宣言的な実装を見つけるべきでしょう。

次のような定義はやめましょう。

raise :: Num a => a -> [a] -> [a]
raise _ [] = []
raise x (y:ys) = x+y : raise x ys

「どれだけのリストが処理されて、出力されるリストの要素がどの値に依存しているのか」を読者が把握するのが難しいからです。ただ、次のように書きましょう。

raise x ys = map (x+) ys

更に次のように書きましょう。

raise x = map (x+)

こうすれば、「全リストが処理されて、出力される要素の各々が、入力されたリストの対応する要素だけに依存する」ことが読者に解ります。

適切な関数を標準ライブラリで見つけることができなかったなら、一般的な関数を抽出しましょう。そうすれば、あなたや他の人がプログラムを理解しやすくなります。Haskellはコードの部分を取り出すのが、とても得意です。それがとても一般的だと分かったなら、それをモジュールに分類して再利用しましょう。それはいずれ標準ライブラリに登場するか、あるいは……既に存在することにあなたがいつか気が付くでしょう。

(訳注:この辺りはd:id:y_fukayaさんが訳してくれました。コメント欄をご覧ください。感謝します!)

このような方法で問題を分解すると、デバッグが楽になるという利点もあります。raise の後者の実装が意図したとおりに動かないときは、map の実装(これは合っていると思いたいですが :-) )を調べることと、(+) に渡されたインスタンスを調べることを、別々に行えます。

もっと一般化できるでしょうか。 raise を map と (+) に分解するこの例は、物事を分割する際の原則の、一つの具体例 (a special case) であるように思えます。原則とは、つまり次の二つに分割することです: コレクション全体に対する繰り返しの処理 (ここでは map) と、コレクションの各要素に適用する処理 (ここでは (x+)) 。あるデータ構造 (リスト、ツリー、その他なんでも) の全体に対する繰り返し処理は、一度書いてしまえば、何度もコピーする必要はありません (少なくとも Haskell では) 。これによりあなたのコードは OnceAndOnlyOnce の原則に従っていられます。この原則は、ある程度以上関数型プログラミングをサポートする言語でないと守るのがとても困難なものです (i.e. Java ではコピー&ペースト式のプログラミングが必要になりますし、C# の delegate の構文は機能しますが不恰好です――ほとんど 金メッキでしょう)





別の例:関数countは特定の特性を満たす要素(つまり述語pがTrueな要素)の数を数えます。

私は次のようなHaskellのコードを発見しました。(より特定の関数に巻きこまれていましたが)

count :: (a -> Bool) -> [a] -> Int
count _ [] = 0
count p (x:xs)
  | p x = 1 + count p xs
  | otherwise = count p xs

このような書き方は、次の書き方に気がついていたら好きにはなれないでしょう。

count p = length . filter p

必要な識別子だけを導入しましょう。

このアドバイスは全ての言語について有効であり、科学的な処理においても重要です(http://www.cs.utexas.edu/users/EWD/transcriptions/EWD09xx/EWD993.html)。 必要な識別子だけを導入してください。GHCに-Wallのようなオプションを渡せば、コンパイラがチェックしてくれることでしょう。

[a | i <- [1..m]]

aは恐ろしく複雑な式であり、iに全く依存していないのだ、という事を理解するのは大変です。

replicate m a

の方が明らかにいいですよね。


ゼロを忘れないで。

ゼロが自然数であったのを忘れないでください。 (訳注:ゼロが自然数かどうかは流儀によるようです)再帰のアンカー(訳注:再帰の終端。これが無いと無限ループに)が適切に選ばれていないと、再帰的関数は非常に複雑になります。「Haskell:離散数学のための良いツール」という本で紹介されている関数tuplesはガードを避けるための良い例です。(訳注:ここでのタプルは、タプル型とは別。一般に「順序を持った組」の事をタプルと言う。)



tuples :: Int -> [a] -> [[a]]
tuples r l
  | r == 1 = [[el] | el <- l]
  | length l == r = [l]
  | otherwise = (map ([head l] ++) (tuples (r-1) (tail l)))
  ++ tuples r (tail l)

何をしているか分かりますか?

(訳注:実行例を載せときます

*Main> tuples 3 [1,2,3,4]
[[1,2,3],[1,2,4],[1,3,4],[2,3,4]]
*Main> tuples 2 [1,2,3,4]
[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]

)


ガードを取り除いて、リスト内包表記を忘れましょう。

tuples :: Int -> [a] -> [[a]]
tuples 1 l = map (:[]) l
tuples r l =
  if r == length l
    then [l]
    else
      let t = tail l
      in map (head l :) (tuples (r-1) t)
      ++ tuples r t

tuplesの引数にゼロが与えられたら、どんな振舞いをするでしょうか?そのパターンを加えてみましょう。

tuples 0 _ = [[]]

もはやtuples 1のパターンは必要ないので消せます。

tuples :: Int -> [a] -> [[a]]
tuples 0 _ = [[]]
tuples r l =
  if r == length l
  then [l]
  else
    let t = tail l
    in map (head l :) (tuples (r-1) t)
                   ++ tuples r t

r > length lの場合はどうでしょうか。headが失敗するのを放置しておく理由は明らかにありません。与えられたリストよりも長いタプルは作れません。だから空リストを返すことにしましょう。これは特別な状況で私達を救ってくれます。

tuples :: Int -> [a] -> [[a]]
tuples 0 _ = [[]]
tuples r l =
  if r > length l
  then []
  else
    let t = tail l
    in map (head l :) (tuples (r-1) t)
                   ++ tuples r t

「length is evil」だと学びました。次のようにしてみたらどうでしょう。

tuples :: Int -> [a] -> [[a]]
tuples 0 _ = [[]]
tuples _ [] = []
tuples r (x:xs) =
  map (x :) (tuples (r-1) xs)
  ++ tuples r xs

lの長さを何度も何度も計算する必要はなくなりました。コードは読みやすくなり、全ての特別な場合をカバーするようになりました。tuples (-1) [1,2,3]のような場合も含めてです!

このlengthチェックの消去はある状況(例:tuples 24 [1..25])において性能を劇的に悪化させます。length l < rの代わりにnull (drop (r-1) l)を使うこともできます。これは無限リストにも対応しています。下の例を見ましょう。

tailsが提供する全てのsuffixのリストを明示的に計算することによって、一方向の再帰を保つこともできます。

do記法を使ってこうも書けます。

tuples :: Int -> [a] -> [[a]]
tuples 0 _ = [[]]
tuples r xs = do
  y:ys <- tails xs
  map (y:) (tuples (r-1) ys)

リストモナドにおける(=<<)はconcatMapですから次のようにも書けます。

前のバージョンではパターンマッチy:ysが最後の空のsuffixを取り除いていましたが、今や手動でやらなければならなくなりました。そこでinitを使います。

tuples :: Int -> [a] -> [[a]]
tuples 0 _ = [[]]
tuples r xs =
  concatMap (\(y:ys) -> map (y:) (tuples (r-1) ys))
            (init (tails xs))

全てのsuffixのリストはiterate tailでも生成できますが、これはPrelude.tail: empty list".というエラーを発生させて終了します。tailsが生成するものは同じものですが適切に終了します。

より一般的には「Base cases and identities」をご覧ください。

λを使いすぎないようにしましょう。

明示的な再帰と同様に明示的なλは、必ずしも悪いものではありませんが、たいていはもっといい解決策が存在するものです。例をあげましょう。

Haskellカリー化が凄く得意なので、次のように書くのは止めましょう。

zipWith (\x y -> f x y)

map (\x -> x + 42)

代わりに、こう書きましょう。

zipWith f

map (+42)

また、このように書く代わりに

-- 文字列のリストを大文字小文字を区別せずにソートする
sortBy (\x y -> compare (map toLower x) (map toLower y))

こう書きましょう。

comparing p x y = compare (p x) (p y)

sortBy (comparing (map toLower))

これなら明確かつ再利用可能です。実はGHC-6.6以降ではcomparingを書く必要がありません。Data.Ordモジュール(http://www.haskell.org/ghc/dist/current/docs/libraries/base/Data-Ord.html)の中に既に存在していますから。


この特別な例についての簡単な注意:変換を複数回評価することを避けることができます。

sortKey :: (Ord b) => (a -> b) -> [a] -> [a]
sortKey f x = map snd (sortBy (comparing fst) (zip (map f x) x))

(訳注:いわゆるシュワルツ変換ですね。http://www.wdic.org/w/TECH/%E3%82%B7%E3%83%A5%E3%83%AF%E3%83%AB%E3%83%84%E5%A4%89%E6%8F%9B)

経験則として、式が長くなりすぎて簡単にポイントフリーに出きそうにない場合は、とにかく名前を付けた方がいいでしょう。しかしながら、たまにはλが適切な場合もあります。例えば、モナディックなコードの中におけるコントロール構造などです。(次の例におけるコントロール構造foreach2は、殆どの言語ではそもそもサポートすらしていないでしょう。)

foreach2 xs ys f = zipWithM_ f xs ys

linify :: [String] -> IO ()
linify lines
        =foreach2 [1..] lines $ \lineNr line -> do
           unless (null line) $
               putStrLn $ shows lineNr $ showString ": " $ show line
Boolは普通の型

論理表現はガードやif分の中に制限された存在ではありません。こういうくどさは避けましょう。

isEven n
 | mod n 2 == 0 = True
 | otherwise = False

これは、次と一緒です。

isEven n = mod n 2 == 0

シンタックスシュガー(構文糖衣)を賢く使いましょう。

シンタックスシュガーを使えば読みやすくなると主張する人々がいます。以下のセクションでは、シンタックスシュガーを減らした方が読みやすくなる例を示します。「特別な記法は純粋な関数による表現よりも、しばしば直感的である」という主張は良く聞きます。 しかしながら「直感的な記法」というものは、いつだって習慣の問題なのです。最初に見たときは馴染みがないような分析的表現に対する直感は発達させることができるものです。そうなると、時折シュガー(砂糖)を減らそうという習慣が身に付きます。

リスト内包表記

リスト内包表記は利用者を命令的な考え方に留めます。変換よりも変数について考えさせるからです。頭を解き放ちポイントフリーの趣を発見しましょう。

[toUpper c | c <- s]

と書く代わりに

map toUpper s

こう書きましょう

次の例を考えてみましょう。

[toUpper c | s <- strings, c <- s]

値がいったい何に依存しているのか理解するのに時間がかります。sやcが何度使われるのか明白ではありません。次と比べましょう

map toUpper (concat strings)

これより明白なものはありませんね。

高階関数を使っていれば、リストから他のデータ構造へと簡単にスイッチできます。

次の二つを比較しましょう

map (1+) list
mapSet (1+) set

Functorクラスの標準インスタンスが存在すれば、次のコードを両方の場合に使えます。

fmap (1+) pool

高階関数について知らなければ、並列リスト内包表記が欲しくなるでしょう。これは不幸な事ですが今やGHCではサポートされています。これは間違いなく過剰です。既に、たくさんのzip風のそれが、素晴しい仕事をしているからです。


do 記法

do記法は命令的な性質(隠れた状態や、実行の順番など)のコード片を表現するのに便利です。しかしながら、do記法が関数を使って表現できる事を覚えていると役に立つことがあります。

do
  text <- readFile "foo"
  writeFile "bar" text

と書く代わりに、こう書けます。

readFile "foo" >>= writeFile "bar"
do
  text <- readFile "foo"
  return text

というコードは「Monadが満たさねばならない法則」のおかげで次のように書けます。

readFile "foo"

あなたは、次のコードが

do
  text <- readFile "foobar"
  return (lines text)

次のコードより複雑であることにも同意するでしょう。

liftM lines (readFile "foobar")

ところでFunctorクラスのfmapメソッドとMonad-basedな関数であるliftMは同じものです。(両方とも正しく定義されていればですが。)

(訳注:Monadは論理的にFunctorなのにも関わらず、FunctorがMonadのスーパークラスではないことを問題視し、クラス階層を変更すべきだという提案がなされています。 http://www.haskell.org/haskellwiki/Functor_hierarchy_proposal をご覧ください。)


「より複雑だ」ということは「悪い」という事を意味しません。これよりもdo記法が長くなるようならば、do記法とfmapを混ぜるべきではないでしょう。「自然であれ」という事を考えるようにしましょう。変化させるのは、変化から何か得られるときのみにしましょう。


ガード

免責:このセクションはガードを使うなとアドバイスしているのではありません。両方とも使用可能ならばパターンマッチングの方がガードよりも好ましいと言っているのです。

-- ダメな実装
fac :: Integer -> Integer
fac n | n == 0 = 1
      | n /= 0 = n * fac (n-1)

これは階乗を求める関数です。この例のようにガードをたくさん使うと、問題がたくさん発生します。

最初の問題は、ガード条件が恣意的に複雑なため(GHCは-Wallオプションを使っていれば警告します。)コンパイラがこのようなガードに漏れがないのかチェックするのはほとんど不可能だと言うことです。

その問題と、漏れのあるパターンがもたらす潜在的なバグを回避するためにotherwiseガードを使えます。

-- いくらか改善された実装
fac :: Integer -> Integer
fac n | n == 0    = 1
      | otherwise = n * fac (n-1)

これが好ましいのには別の理由もあります。人間にとって可読性が高いという点と、コンパイラが最適化しやすいという点です。

このような単純なケースではあまり問題になりませんが、もっと複雑な場合でも、otherwiseを見れば、それが使われるのは他のガードが失敗したときだけだと、ただちに明らかになります。 同じ事がコンパイラにも言えます。Trueの同義語であるotherwiseを最適化するのは可能ですが、他の殆どの式に対しては期待できません。

-- シュガー減量  (if-then-elseの多弁さは、シュガーと捉えることができますが……)
fac :: Integer -> Integer
fac n = if n == 0
          then 1
          else n * fac (n-1)

ifには別の問題群があります。レイアウトルールに関するものであったり、ifのネストは読みにくいというものだったりします。(ifのネストを避けたいならCaseの項目を読んでください)

この特別な例では、パターンマッチングを使うことで、より簡単にできます。

-- 良い実装
fac :: Integer -> Integer
fac 0 = 1
fac n = n * fac (n-1)

実際には、このケースでは、もっと読みやすいバージョンがあります。それは明示的な再帰を使わない方法です。

-- 素晴らしい実装
fac :: Integer -> Integer
fac n = product [1..n]

これは効率的でもあります。productはライブラリの作者によって最適化されていると思われます。GHCで最適化を有効にして実行すると、このバージョンが使用するスタックスペースはO(1)になります。それと比べて、前のバージョンはO(n)のスタックスペースを使用します。

このバージョンと前のバージョンには違いがあります。負の数が与えられると前のバージョンは終わりませんが、このバージョンは1を返します。

いつだってガードがコードを綺麗にするとは限りません。次のコードを比較してみましょう。

foo xs | not (null xs) = bar (head xs)
foo (x:_) = bar x

あるいは次の二つの例を比較しましょう。(パターンガードの例)

parseCmd ln
   | Left err <- parse cmd "Commands" ln
     = BadCmd $ unwords $ lines $ show err
   | Right x <- parse cmd "Commands" ln
     = x
parseCmd ln = case parse cmd "Commands" ln of
   Left err -> BadCmd $ unwords $ lines $ show err
   Right x  -> x

読者がeither関数と親しみ深ければ、次のコードもいいでしょう。

parseCmd :: -- add an explicit type signature, as this is now a pattern binding
parseCmd = either (BadCmd . unwords . lines . show) id . parse cmd "Commands"

ついでに言えば、コンパイラーはしばしば数値パターンについての問題を抱えています。たとえばパターン0は、実際は「fromInteger 0」です。関数のパラメータのパターンとして一般的できない計算が呼ばれることを意味します。これを説明するために、次の例について考えてみましょう。

(訳注:Haskell98の次の標準規格であるHaskell Primeの議論において、数値パターンを排除すべきでないか、という提案がなされています。「みんな使っているし、無いと冗長になる」という反論もなされています→http://hackage.haskell.org/trac/haskell-prime/wiki/RemovalCandidates )


data Foo = Foo deriving (Eq, Show)
 
instance Num Foo where
    fromInteger = error "forget it"
 
f       :: Foo -> Bool
f 42    = True
f _     = False

 *Main> f 42
 *** Exception: forget it

ガードは必要なときのみ使いましょう。可能なときはいつでもパターンマッチングに頼りましょう。

n+k パターン

数値型へのパターンマッチを認めるためにHaskell 98はいわゆる n+k patternsを提供しています。

take :: Int -> [a] -> [a]
take (n+1) (x:xs) = x: take n xs
take _     _      = []

しかしながら、これらは計算の複雑性を隠し、曖昧さを導入していると、しばしば批判されています。詳しくは/Discussionを読んでください。

このパターンは、より一般的なViews提案(残念ながら、長い時間がたっているのにもかかわらず実装されたことはありませんが)に包括されます。

(訳注:n+kパターンはHaskell Primeでは排除される候補のひとつです。http://hackage.haskell.org/trac/haskell-prime/wiki/RemovalCandidates)

効率と無限

経験則「無限のデータ構造に対しても意味が通るはずの関数が、無限のデータに対して適用することで失敗するようであれば、その関数は恐らく有限のデータに対しても適用したときも効率が悪い。」

必要も無いのにリストの長さを尋ねるのは止めましょう。

リストxが空かを調べるのに次のように書くのは止めましょう。

length x == 0

このように書くとHaskellはリスト全てのノードを作成せねばならず、無限リストの場合Falseが帰ってくるべきなのに失敗します。(ちなみに、それでもリストの中身までは評価されないでしょう。)

これと比べ

x == []

は高速です。しかし、リストxの型を[a]だとすると、aはEqクラスの型でなければなりません。

ベストな手段は次の通りです。

null x

加えていうと、length関数を使用しているとき、多くの場合は、問題を十分に限定できていないのです。リストの長さが知りたいのではなく、「リストが少くともある長さであるか」をチェックしたいのなら、lengthを「リストの長さが必要な最小限の長さよりも長いか」を調べるatLeast関数で置き変えるべきです。

atLeast :: Int -> [a] -> Bool
atLeast 0 _      = True
atLeast _ []     = False
atLeast n (_:ys) = atLeast (n-1) ys

再帰を避けるために、効率が落ちてもいいのなら(takeもlengthもノードの数を数えなければならないので無駄があります)次のように書けます。

atLeast :: Int -> [a] -> Bool
atLeast n x = n == length (take n x)

再帰を避けながら、効率も落としたくないのならば、次のように書くといいでしょう。

atLeast :: Int -> [a] -> Bool
atLeast n =
  if n>0
    then not . null . drop (n-1)
    else const True

あるいは次のような書き方もできます。

atLeast :: Int -> [a] -> Bool
atLeast 0 = const True
atLeast n = not . null . drop (n-1)

「あるリストを、他のリストの長さと同じだけ短かくしたい」場合に、次のコードでは同じ問題が起きます。

take (length x) y

これは、巨大なリストに対しては非効率であり、無限リストに対しては失敗します。しかしながら、無限リストから有限のprefixを抽出することは便利かもしれません。それなら代わりにこう書きましょう。

zipWith const y x

これなら上手く動きます。

lengthはgenelicLengthに置きかえることができ、それはPeano数が利用できることを覚えておきましょう。(訳注:genelicLengthとPeano数(遅延に的した構造を持つ)の組み合わせで遅延カウントができるらしいです→http://www.haskell.org/haskellwiki/Peano_numbers)


必要もないのに最小値を尋ねるのは止めましょう。

次の関数isLowerLimitは、ある数がリストの最小値かどうかをチェックします。


isLowerLimit :: Ord a => a -> [a] -> Bool
isLowerLimit x ys = x <= minimum ys

これはysが無限ならば明らかに失敗します。これは問題だといえるでしょうか?

次と比較しましょう.

isLowerLimit x = all (x<=)

この定義ならxが最小値でなければ無限リストを与えても終了します。

xより小さな値が見付かればただちに終了します。つまり有限のリストに対しても速いということです。更に空リストに対しても動きます。


共有しましょう。

もし、中身は同じで長さが伸びていくリストを作りたいのなら、次のようには書かないでください。

map (flip replicate x) [0..]

なぜなら、2乗の空間と実行時間を必要とするからです

iterate (x:) []

こうすれば、リストはsuffixを共有するので、作成するのに線形の空間と実行時間しか必要としません。


(訳注:「tailsもリストのコピーを作らなくて効率的」という話も知っておくと便利なケースがあるかもしれません。 http://haskell.g.hatena.ne.jp/jmk/20060913)


適切なfoldを選びましょう。

どちらのfoldが状況に適切なのかというアドバイスが「

[x !! i - i | i <- [0..n]]
zipWith (-) x [0..n]
効率性ヒントの項目で述べられている通りです。


型クラス制約を減らそう

delete, (\\), nub等の関数を使うにはEQクラスの型が必要になることを覚えておきましょう。リストに複数の等しい要素が含まれていたら期待したようには動いてくれないという事と、関数のように要素の型が比較できないなら使えないという事です。

例)次の関数は入力されたリストxsから、xsの要素を一つづつ取り除いた、それぞれのものを返します。

何をいってるか解りますか?分かりませんか?恐らくコードならもっと理解しやすいと思います。

removeEach :: (Eq a) => [a] -> [[a]]
removeEach xs = map (flip List.delete xs) xs

これは次のように書き換えるべきです。

removeEach :: [a] -> [[a]]
removeEach xs =
   zipWith (++) (List.inits xs) (tail (List.tails xs))

これならaが関数型であっても、xsに等しい要素があっても完璧に動きます。


  • 整数を考慮していないならIntを使うのを止めましょう。

Cのスタイルのように、あらゆるものに整数を使う前に、もっと特定の型を使う事を考えましょう。

0と1にしか興味がないのならBoolを使いましょう。事前に定義された選択肢があり、数値的な演算子が必要ないのなら、列挙型を試しましょう。

次のように書かず

type Weekday = Int

このように書きましょう。

data Weekday = Monday
             | Tuesday
             | Wednesday
             | Thursday
             | Friday
             | Saturday
             | Sunday
  deriving (Eq, Ord, Enum)

これは ==, <, succのような目的に敵った演算子は許容し、+, *のような意味のない演算子を禁止します。

こうすれば、間違って曜日と数字を混ぜたりできませんし、weekdayをパラメータに取る関数のシグニチャを見れば、期待するデータの種類が何なのかを明白に分かります。

列挙型が不適切な場合は、必要としている型に最も近い型を転用してnewtypeを定義できます。

たとえば、オブジェクトを一意的な識別子と関連付けたいとします。

整数型を選びたくなるかもしれませんが、演算が必要ないのなら、次のように実際の整数と区別した型を作れます。

newtype Identifier = Identifier Int deriving Eq

その他

IOとデータ処理を分離しましょう

IO Monadをどこでも使うのはよくありません。 ほとんどのデータ処理はIOとの相互作用無しに書けます。 データ処理とIOを分けて、(実行順序を特定する必要がなく、何が実際に必要な計算なのか考えなくてすむように)純粋な関数的に処理できるようにしましょう。純粋関数的にデータを処理し、それを簡潔なIOとの相互作用で出力すれば、遅延評価の便益を受けられます。

-- import Control.Monad (replicateM_)
replicateM_ 10 (putStr "foo")

は明らかに次のコードよりも悪いです。

putStr (concat $ replicate 10 "foo"

同様に、

do
  h <- openFile "foo" WriteMode
  replicateM_ 10 (hPutStr h "bar")
  hClose h

は次のように短かくできます。

writeFile "foo" (concat $ replicate 10 "bar")

これは、失敗したときはファイルハンドルhが適切に閉じられるようになっています。

カスタムした分布を持つランダムな値を計算したい関数(distInvは分布関数を反転させます)はIOを使って

次のように定義できます。

randomDist :: (Random a, Num a) => (a -> a) -> IO a
randomDist distInv = liftM distInv (randomRIO (0,1))

しかし、こうする必要はありません。乱数生成器の状態を覚えるためだけに、全ての世界の状態を記憶しておく必要は無いからです。そこで、次のようにしたらどうでしょう。

randomDist :: (RandomGen g, Random a, Num a) => (a -> a) -> State g a
randomDist distInv = liftM distInv (State (randomR (0,1)))

Stateを走らせることで実際の値を得られます。次のようにしましょう。

evalState (randomDist distInv) (mkStdGen an_arbitrary_seed)
quotとremについては忘れましょう。

こやつらは負の被除数を扱うのを難しくさせます。

divとmodは、たいていいつも良い選択であり、b > 0なら次を満たします

a == b * div a b + mod a b
mod a b < b
mod a b >= 0

quotとremでも最初の等式はTrueですが,他の二つはmodにはTrueなのにremにはFalseです。

つまりmod a b は[0..(b-1)]の間にaをラップするものですが、rem a b の符号はaの符号に依存しているのです。

これは「優秀な理由」というよりも経験の問題のようです。なので被除数の符号が除数の符号よりも重要な場合もあると反論するかもしれません。しかしながら、私はそのような適所を見かけたことはありません。quotとremが使われていたとしても、多くの場合はdivやmodを使った方が良いのです。

  • 連続的に数えられたトーンピッチを音程C(ド),D(レ),E(ミ)のクラスに変換したい場合: mod p 12
  • 要素の数がmの倍数になるようにpaddingする場合: xs ++ replicate (mod (- length xs) m) pad
  • 日付データを曜日に換算する場合: mod n 7
  • パックマンが画面から走り出て画面の逆から現われる場合: mod x screenWidth

次の文章も読んでください。


fromJustやheadのような部分関数

fromJustやheadのように、特定の値が入力されると失敗するような関数は避けましょう。実行時にしか検知できないエラーを起こします。プログラムを別のやりかたで組み上げることによって部分関数の使用を回避できないか考えるか、もっとエラーを起こさないような限定された型を選びましょう。

次のように書かず

if i == Nothing then deflt else fromJust i

このように書きましょう。

fromMaybe deflt i

(==)はEQクラスインスタンスをiの型として要求しますがfromMaybeはパターンマッチングを行うので、それを必要しない事に気付いてください。


このようにfromJustを避けることができない場合でも、とにかくfromMaybeを使って「あなたの状況では何故値が常にJustになると考えているのか」をerrorに付記してください。

fromMaybe (error "Function bla: The list does always contains the searched value")
          (lookup key dict)

「決して空にならないような型」を使うことでheadの問題を避けることが出来ますが(訳注:CycloneやCwという言語では、そうしているようです。) 、Maybeを使ったやりかたもあります。

関連するリンク

Haskell初心者がやりがちな一般的な間違いや間違った信念 Beginners
いくらか一般的な、それほど一般的でないHugs Errors

y_fukayay_fukaya2008/12/24 18:05はじめまして。
意味がとれないとおっしゃっている部分があったので、翻訳の参考になればと訳してみました。原文を盛大に破壊しています (間に勝手に文を補ったりしてます) が、ニュアンスとしてはこういうことではないかと思います。


Decomposing a problem this way also has the advantage that you can debug more easily. If the last implementation of raise does not show the expected behaviour, you can inspect map (I hope it is correct :-) ) and the invoked instance of (+) separately.

このような方法で問題を分解すると、デバッグが楽になるという利点もあります。raise の後者の実装が意図したとおりに動かないときは、map の実装(これは合っていると思いたいですが :-) )を調べることと、(+) に渡されたインスタンスを調べることを、別々に行えます。

Could this be stated more generally? It seems to me this is a special case of the general principle of separating concerns: iteration over a collection vs operating on elements of a collection should apply. If you can write the loop over a data structure (list, tree, whatever) once and debug it, then you don't need to duplicate that code over and over (at least in haskell), so your code can follow the principle of Wiki:OnceAndOnlyOnce ; Wiki:OnceAndOnlyOnce is a lot harder in languages that don't provide a certain level of functional programming support (i.e. Java requires copy and paste programming, the delegate C# syntax is clumsy but workable - using it is almost Wiki:GoldPlating).

もっと一般化できるでしょうか。raise を map と (+) に分解するこの例は、物事を分割する際の原則の、一つの具体例 (a special case) であるように思えます。原則とは、つまり次の二つに分割することです: コレクション全体に対する繰り返しの処理 (ここでは map) と、コレクションの各要素に適用する処理 (ここでは (x+)) 。あるデータ構造 (リスト、ツリー、その他なんでも) の全体に対する繰り返し処理は、一度書いてしまえば、何度もコピーする必要はありません (少なくとも Haskell では) 。これによりあなたのコードは Wiki:OnceAndOnlyOnce の原則に従っていられます。この原則は、ある程度以上関数型プログラミングをサポートする言語でないと守るのがとても困難なものです (i.e. Java ではコピー&ペースト式のプログラミングが必要になりますし、C# の delegate の構文は機能しますが不恰好です――ほとんど Wiki:GoldPlating でしょう)


文中 Wiki:OnceAndOnlyOnce や Wiki:GoldPlating と書かれているのは、推測ですが Wikipedia への interwiki ではないかと思います。英語版 Wikipedia の OnceAndOnlyOnce の項は "Don't repeat yourself" の項にリダイレクトされていて、これには日本語版の記事 (http://ja.wikipedia.org/wiki/Don't_repeat_yourself) がありますから、これにリンクするのが無難かなあと思います。

GoldPlating は自分もいまいち意味がとれていません。単純に、関数型的な機能は C# という言語に後付けされた(金をメッキ処理された)ものだということかと推測するのですが、何か他の意味合いで使っているのかもしれません。

以上、お役に立てば幸いです。

taninswtaninsw2008/12/24 19:27ご協力ありがとうございます。反映……というかコピペさせていただきました。

http://en.wikipedia.org/wiki/Gold_plating_%28disambiguation%29
ここの項目を見る限りでは「望まれたものを越えた価値の無い無駄な機能追加」という意味なのかなぁ、と思いました。

ThitaThita2013/03/29 16:50At last, smooene who comes to the heart of it all

fgfiinfgfiin2013/03/31 22:16oHw9Ul , [url=http://xxqubjmimmgh.com/]xxqubjmimmgh[/url], [link=http://tsulqdptgaqj.com/]tsulqdptgaqj[/link], http://sdafaupukvii.com/

bnbkfxdfabnbkfxdfa2013/04/01 05:09yRGC6C <a href="http://lyuyazfamgba.com/">lyuyazfamgba</a>

uhyfaumoeguhyfaumoeg2014/04/12 20:58vmiyjibtlfmm, <a href="http://www.ftgcmaoiso.com/">mgofkntkfh</a> , [url=http://www.grpdcysrgi.com/]pylrgcmetb[/url], http://www.uoojtwewed.com/ mgofkntkfh

uqawoporaxofuqawoporaxof2017/03/27 02:57http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ixubviqomupuixubviqomupu2017/03/27 03:01http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ilauniwoqibehilauniwoqibeh2017/03/27 03:09http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

utoweliutoweli2017/03/27 03:15http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

idibinarizoidibinarizo2017/03/27 03:20http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ijizifisuodiijizifisuodi2017/03/27 03:29http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

eqaupimelxoeqaupimelxo2017/03/27 03:34http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

oduyudaixuoduyudaixu2017/03/27 03:53http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ezetaciezetaci2017/03/27 03:58http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

upuguwatbaupuguwatba2017/03/27 04:11http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

esihibepiqpicesihibepiqpic2017/03/27 04:18http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

azafiqiniuuazafiqiniuu2017/03/27 04:37http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

oepohehajuuheoepohehajuuhe2017/05/21 06:45http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

oqinavuvezeqioqinavuvezeqi2017/05/21 06:58http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

axoneujitorfaxoneujitorf2017/05/21 07:08http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

aigoxeiyifoaigoxeiyifo2017/05/21 07:10http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

iksewumoiksewumo2017/05/21 07:13http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

ejurijuxuejurijuxu2017/05/21 07:20http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

orjozovocoborjozovocob2017/05/21 07:30http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

ejepukavubozaejepukavuboza2017/05/21 07:33http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

ukezosoxalaukezosoxala2017/05/21 07:57http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

onominwinonominwin2017/05/21 08:11http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

edijuhizeyoedijuhizeyo2017/05/21 08:11http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

equsisqoluequsisqolu2017/05/21 08:23http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

aquxowibephibaquxowibephib2017/05/22 07:19http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

aqelovoaqelovo2017/05/22 07:33http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

okuremusulobiokuremusulobi2017/05/22 17:15http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

eueroyuzieueroyuzi2017/05/23 07:23http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

ufeboziyerogufeboziyerog2017/05/23 19:17http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

apuexibaloapuexibalo2017/05/23 19:30http://100mgcheapest-price-viagra.com/ - 100mgcheapest-price-viagra.com.ankor <a href="http://tadalafil-buy-5mg.com/">tadalafil-buy-5mg.com.ankor</a> http://20mgprednisone-order.com/

ecaduqivaecaduqiva2017/08/11 08:25http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

opuhokazopuhokaz2017/08/11 08:38http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

acuquhoacuquho2017/08/11 08:38http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

galopacirgalopacir2017/08/11 08:46http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

ejohatabakejohatabak2017/08/11 08:51http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

afohqiqunaceafohqiqunace2017/08/11 08:59http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

ogisuunuogisuunu2017/08/24 12:35http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

uvavufulauvavufula2017/08/24 12:48http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

unayefeuhrunayefeuhr2017/08/24 12:57http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

odixafuquyiodixafuquyi2017/08/24 13:00http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

ufuseveufuseve2017/08/24 13:06http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

opabeleiopabelei2017/08/24 13:13http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

eicibevaeicibeva2017/08/24 13:14http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

eqifubaheqifubah2017/08/24 18:18http://20mg-cheapesttadalafil.com/ - 20mg-cheapesttadalafil.com.ankor <a href="http://20mg-cheapesttadalafil.com/">20mg-cheapesttadalafil.com.ankor</a> http://20mg-cheapesttadalafil.com/

紅蜘蛛紅蜘蛛2017/10/12 16:52紅蜘蛛(液体)+壮陽丹: http://www.allkanpou.com/product/%E7%B4%85%E8%9C%98%E8%9B%9B.html
紅蜘蛛(液体)+壮陽丹の紹介

紅蜘蛛は液体、各飲料、アルコール類、お湯によく溶ける。数分間のうちに効果が見られ、情熱があふれ出ていて、女の子らしくなる。

紅蜘蛛(液体)+壮陽丹の 成分

山藥、枸杞、甘草、欠實、百合など

紅蜘蛛(液体)+壮陽丹 説明

今夜はその気になりたい女性にピッタリです。 女性は飲用20分後には

心ときめき、吐息は熱くなり、ムズムズし、目には渇望が現れ

急に欲しくなります。あなたとともに愛欲の川を渡る、このとき女性の情熱はほとばしり、

ほれているようになります。

SEX&ONSEX&ON2017/10/12 16:54SEX&ON(性1号)女性用媚薬:http://www.chinakanpo.com/product/xingyihao.html
情欲の粉SEX&ON女性の溶剤の種類の特効に情の粉を催促するように催促して、輸入完成品輸入。白色の粉末、無色で味がなくて、いかなる飲み物で溶けて、薬効は力強くて、強烈に性的興奮を増加して、極度に興奮して、現在のヒットの製品の中の一つです!

房事の神油房事の神油2017/10/12 16:55房事の神油:http://www.kanpoucom.com/product/451.html
房事の神油で、早漏防止シート(トノスの約2倍~3倍)ポルノ男優を越えた!

房事の神油についての注意事項:

●必要時の5分~4時間前に男性自身を濡れシートで拭くだけでOK。
●ご使用は房事直前の5分前から4時間前と幅広いのは早く持続状態に達し、それが長時間持続する為。
30分も経てば、いくらお風呂で拭いても洗っても持続時間に影響なし。
絶対的な自信を持って出品しておりますが、万一、ご満足いただけない場合は、返金制度あり。
下記の発送の欄に書いてあります。
幸いにも、未だに返金制度を利用された方はございません。
●房事の時間は自分でコントロール可。
●無味・無臭・ヒリヒリ感なし・全く気付かれません。

インモラルインモラル2017/10/12 17:06インモラル:http://www.shanghaikanpo.com/view/1519.html
水やぬるま湯に半分の量を溶かして混ぜてSEX20分~30分前に飲んでください。

女性が飲む精力剤です。
本品は輸入FLY原料を使ってできた物です。飲んだ数分後に女性の内腿あたりが、ムズムズしだし、性器の中がうずきだします。淫乱になります。
分泌液が大量に出だし、早く欲しい気持ちが現れます。
顔が熱くなり喉が渇きますが、性交への気持ちは高まり我慢できなくなってきます。
性交中は普段以上に感度が高まり、男性を求めてきます。
SEX中の記憶があまり残りません。(言動や体位など記憶として残りません。夢のような感覚です。)

巨人倍増巨人倍増2017/10/19 17:08米国金根:http://www.allkanpou.com/product/beikokukingne.html
狼一号:http://www.allkanpou.com/product/%E7%8B%BC1%E5%8F%B7.html
巨人倍増:http://www.allkanpou.com/product/%E5%B7%A8%E4%BA%BA%E5%80%8D%E5%A2%97.html

德國魔棒德國魔棒2017/10/19 17:10999神油 女性用:http://www.chinakanpo.com/product/999shengyounvxingyong.html
シアリス:http://www.chinakanpo.com/product/Cialis1.html
德國魔棒:http://www.chinakanpo.com/product/deguomobang.html

五夜神五夜神2017/10/19 17:11SEX&ON(性1号)女性用媚薬:http://www.kanpoucom.com/product/538.html
五夜神:http://www.kanpoucom.com/product/664.html
ホーニージェル狂潮嬌娃:http://www.kanpoucom.com/product/704.html

ocucabpadiocucabpadi2017/12/08 08:14http://price-of-levitra-20mg.mobi/ - price-of-levitra-20mg.mobi.ankor <a href="http://buyventolin-online.mobi/">buyventolin-online.mobi.ankor</a> http://buylevitrageneric.mobi/

acmazelacmazel2017/12/08 08:32http://price-of-levitra-20mg.mobi/ - price-of-levitra-20mg.mobi.ankor <a href="http://buyventolin-online.mobi/">buyventolin-online.mobi.ankor</a> http://buylevitrageneric.mobi/

azegucitazegucit2017/12/08 09:08http://price-of-levitra-20mg.mobi/ - price-of-levitra-20mg.mobi.ankor <a href="http://buyventolin-online.mobi/">buyventolin-online.mobi.ankor</a> http://buylevitrageneric.mobi/

ifcdufarijifcdufarij2017/12/08 14:45http://price-of-levitra-20mg.mobi/ - price-of-levitra-20mg.mobi.ankor <a href="http://buyventolin-online.mobi/">buyventolin-online.mobi.ankor</a> http://buylevitrageneric.mobi/

ivucijacikuoivucijacikuo2017/12/08 14:59http://price-of-levitra-20mg.mobi/ - price-of-levitra-20mg.mobi.ankor <a href="http://buyventolin-online.mobi/">buyventolin-online.mobi.ankor</a> http://buylevitrageneric.mobi/

iyatedaiyateda2017/12/08 18:21http://price-of-levitra-20mg.mobi/ - price-of-levitra-20mg.mobi.ankor <a href="http://buyventolin-online.mobi/">buyventolin-online.mobi.ankor</a> http://buylevitrageneric.mobi/

eseevobveseevobv2017/12/09 02:49http://price-of-levitra-20mg.mobi/ - price-of-levitra-20mg.mobi.ankor <a href="http://buyventolin-online.mobi/">buyventolin-online.mobi.ankor</a> http://buylevitrageneric.mobi/

iluixowumoiluixowumo2017/12/09 03:02http://price-of-levitra-20mg.mobi/ - price-of-levitra-20mg.mobi.ankor <a href="http://buyventolin-online.mobi/">buyventolin-online.mobi.ankor</a> http://buylevitrageneric.mobi/

uyakafucehuyakafuceh2018/03/20 12:32http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

bazituatebazituate2018/03/20 12:38http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

uacijihenavieuacijihenavie2018/03/20 12:47http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

ufilluleufillule2018/03/20 12:53http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

uahokefifoimuahokefifoim2018/03/20 12:56http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

ogaseqanniogaseqanni2018/03/20 13:12http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

iugihiwiugihiw2018/03/20 13:12http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

elecoegotuelecoegotu2018/03/20 13:28http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

ayokiqngenriayokiqngenri2018/03/20 13:28http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

ufiosolowufiosolow2018/03/20 13:39http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

oneneagoloneneagol2018/03/20 13:45http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

itagaxiyitagaxiy2018/03/20 13:48http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

unoqoqqounoqoqqo2018/03/20 14:00http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

anepkulurikoanepkuluriko2018/03/20 14:10http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

oganigumukaoganigumuka2018/03/20 14:24http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

odalepiluodalepilu2018/03/27 10:17http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

owuxeeremowuxeerem2018/03/27 10:22http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

ajozajilaluyiajozajilaluyi2018/03/27 10:28http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

evohefukevohefuk2018/03/27 10:32http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

ediwasoediwaso2018/03/27 10:43http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

ekoletyaxekoletyax2018/03/27 10:47http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

cbifudelufivcbifudelufiv2018/03/27 10:58http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

areyukonodepiareyukonodepi2018/03/27 11:02http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

ixudefueixudefue2018/03/27 11:07http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

ifulopekeifulopeke2018/03/27 11:12http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

arajeofimarajeofim2018/03/27 11:13http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

uxirusateuxirusate2018/03/27 11:22http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

uebipoxuebipox2018/03/27 11:31http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

oragatoboragatob2018/03/27 11:33http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

uwijadipuwijadip2018/03/27 11:45http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

oqpupiyokiotoqpupiyokiot2018/03/27 11:48http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

DomDeappyDomDeappy2018/04/24 20:23Viagra Frau Wirkung Buy Plavix Online Cheap <a href=http://cialviag.com>cialis canada</a> Cialis Billig Auf Rechnung Canadian Pharm Support Group

JefferyVianoJefferyViano2018/05/12 03:25direct kamagra uk
kamagra shop erfahrungen 2015
the kamagra store hoax
super kamagra opinie forum

JuniordruckJuniordruck2018/06/15 02:37generic viagra walmart price
<a href="http://viagrapipls.com/">buy generic viagra online</a>
cvs pharmacy viagra prices
<a href="http://viagrapipls.com/">buy generic viagra</a>
viagra preço infarmed

JaredExeseJaredExese2018/06/18 05:41new viagra commercial brunette actress name
<a href="http://amsboatyard.com/">buy viagra</a>
generic viagra best place to buy
<a href="http://amsboatyard.com/">buy generic viagra</a>
viagra without a doctor prescription us ph

JuniordruckJuniordruck2018/06/18 09:06viagra prices at sam's club
<a href="http://viagrapipls.com/">buy viagra</a>
viagra side effects webmd
<a href="http://viagrapipls.com/">buy viagra online</a>
generic brand names for viagra

JaredExeseJaredExese2018/06/18 19:24generic viagra names mazzograna
<a href="http://amsboatyard.com/">buy viagra</a>
viagra medicine timing
<a href="http://amsboatyard.com/">buy generic viagra</a>
ben stiller's fake female viagra commercial

MichaelDefMichaelDef2018/06/20 22:32price of cialis at walmart pharmacy
<a href="http://justinpro.com/">buy cialis</a>
woman in cialis commercial
<a href="http://justinpro.com/">buy cialis online</a>
cialis 20 mg dosing information

DanielMUSDanielMUS2018/06/22 20:02kamagra shop deutschland erfahrung
<a href="http://kamagraonl.com/">kamagra</a>
kamagra jelly 100mg
<a href="http://kamagraonl.com/">kamagra oral jelly</a>
kamagra 100mg oral jelly suppliers indianapolis indiana

MichaelDefMichaelDef2018/06/22 22:43low cost viagra cialis generic
<a href="http://justinpro.com/">buy cialis</a>
cialis super active reviews
<a href="http://justinpro.com/">buy cialis online</a>
cialis 20 mg dosage

TracyDofTracyDof2018/06/24 06:38generic for cialis or viagra
<a href="http://amsboatyard.com/">viagra</a>
viagra commercial actress brunette 2015
<a href="http://amsboatyard.com/">buy generic viagra</a>
buy viagra at walmart

MatthewwayncMatthewwaync2018/06/25 04:48cialis online ebay
<a href="http://cialisgrudj.com/">generic cialis</a>
cialis prices in usa
<a href="http://cialisgrudj.com/">generic cialis</a>
is there a generic for cialis or viagra

MatthewwayncMatthewwaync2018/06/26 00:10cialis 5 mg 6 tablets cost
<a href="http://cialisgrudj.com/">cialis</a>
how long does cialis side effects last
<a href="http://cialisgrudj.com/">buy generic cialis</a>
cialis 20mg dose

AntonImaltAntonImalt2018/06/26 21:08side effects from cialis 5mg
<a href="http://cialisgenericsa.com/">buy generic cialis</a>
cialis 5mg price uk
<a href="http://cialisgenericsa.com/">buy generic cialis</a>
cialis 20mg generic price

AntonImaltAntonImalt2018/06/27 14:52walgreens cialis coupon
<a href="http://cialisgenericsa.com/">generic cialis</a>
cialis dose vs viagra dose
<a href="http://cialisgenericsa.com/">buy generic cialis online</a>
specialist in cytotechnology exam

AllanNoubsAllanNoubs2018/06/27 20:56cialis 100mg plus dapoxetine 60mg
<a href="http://cialispaxl.com/">buy cialis generic</a>
cialis 20 mg benefits
<a href="http://cialispaxl.com/">buy cialis generic</a>
cialis super active tadalafil

AntonImaltAntonImalt2018/06/29 08:13generic cialis shipped from usa
<a href="http://cialisgenericsa.com/">buy cialis online</a>
cialis generico preço
<a href="http://cialisgenericsa.com/">generic cialis</a>
cialis 5 mg how long does it take to work

FloyddaHFloyddaH2018/06/30 07:41kamagra 100 chewable polo
<a href="http://kamagradyn.com/">kamagra 100mg</a>
kamagra 100mg tabletta
<a href="http://kamagraonl.com/">kamagra oral jelly</a>
kamagra oral jelly 100mg price

AllanNoubsAllanNoubs2018/07/01 19:14generic cialis dosage and side effects
<a href="http://cialispaxl.com/">generic cialis</a>
effectiveness of cialis vs viagra vs levitra comparison table
<a href="http://cialispaxl.com/">generic cialis</a>
cialis 5mg price cvs

FloyddaHFloyddaH2018/07/01 23:55kamagra store in nyc
<a href="http://kamagradyn.com/">kamagra 100mg</a>
kamagra shop erfahrungen 2015
<a href="http://kamagraonl.com/">kamagra oral jelly</a>
india kamagra 100mg chewable tablets

RobertvoilaRobertvoila2018/07/13 03:09kamagra oral gel
<a href="https://www.kamagrapos.com/">kamagra</a>
kamagra oral jelly amazon
<a href="https://www.kamagrapos.com/">kamagra 100mg</a>
kamagra oral jelly for sale in usa illegally

RobertvoilaRobertvoila2018/07/14 03:40kamagra 100 tablets usage
<a href="https://www.kamagrapos.com/">kamagra oral jelly</a>
kamagra usage
<a href="https://www.kamagrapos.com/">kamagra oral jelly</a>
kamagra oral jelly vs cialis

DavidLidayDavidLiday2018/07/14 11:15kamagra usa
<a href="https://www.kamagrajellyk.com/">kamagra oral jelly</a>
kamagra 100mg chewable tablets
<a href="https://www.kamagrajellyk.com/">kamagra oral jelly</a>
kamagra oral jelly uses

CharlesCoinKCharlesCoinK2018/07/14 17:36cialis price vs viagra dosage
<a href="http://viagrapipls.com/">generic viagra</a>
cheap viagra online in usa
<a href="http://viagrapipls.com/">viagra generic</a>
female viagra reviews 2018
http://viagrapipls.com/
compra viagra generico espaГ±a

HaroldElaloHaroldElalo2018/07/16 05:22kamagra use
<a href="https://www.kamagradax.com/">kamagra 100mg</a>
kamagra shop deutschland erfahrungen
<a href="https://www.kamagradax.com/">kamagra 100mg</a>
kamagra 100mg tablets reviews

HaroldElaloHaroldElalo2018/07/17 13:28kamagra kopen rotterdam
<a href="https://www.kamagradax.com/">buy kamagra</a>
kamagra rendeles
<a href="https://www.kamagradax.com/">buy kamagra</a>
kamagra 100mg oral jelly wirkung

DavidLidayDavidLiday2018/07/17 19:06kamagra oral jelly kaufen paypal
<a href="https://www.kamagrajellyk.com/">buy kamagra oral jelly</a>
kamagra oral gel
<a href="https://www.kamagrajellyk.com/">kamagra jelly</a>
kamagra 100mg oral jelly sildenafil

MichaelCaxMichaelCax2018/07/31 11:16kamagra 100mg oral jelly usa
<a href="https://www.kamagrajellyk.com/">buy kamagra</a>
kamagra oral jelly online kaufen paypal
<a href="https://www.kamagrajellyk.com/">kamagra oral jelly</a>
kamagra oral jelly kaufen deutschland paypal

mtaletheozmtaletheoz2018/07/31 16:31<a href="http://kqcopy.com">cheapest generic viagra online</a> buy real viagra http://kqcopy.com

jtaletzxocjtaletzxoc2018/07/31 21:21<a href="http://bakerssign.com">generic levitra reviews</a> purchase levitra online http://bakerssign.com

xtaletnyikxtaletnyik2018/08/01 14:35<a href="http://istanbulexpressonline.com">cheap uk viagra</a> buy generic viagra http://istanbulexpressonline.com

utaletxcquutaletxcqu2018/08/03 10:36<a href="http://kqcopy.com">order viagra overnight</a> viagra price http://kqcopy.com

vtaletegsdvtaletegsd2018/08/04 10:52<a href="http://bakerssign.com">viagra cialis levitra price comparison</a> levitra 10 mg http://bakerssign.com

italetocbditaletocbd2018/08/04 16:38<a href="http://gigawatt6.com">generic cialis cheapest price</a> order cialis from india http://gigawatt6.com

FloydDotFloydDot2018/08/04 21:35brand cialis 100 mg
<a href="http://akkordeon-shop.ru/assets/skazki-v-kotorih-est-kryak.html">сказки в которых есть кряк</a>
cialis comanda
<a href="http://akkordeon-shop.ru/assets/snip-po-tehnike-bezopasnosti-v-stroitelstve-skachat.html">снип по технике безопасности в строительстве скачать</a>
viagra cialis levitra dose comparison
http://akkordeon-shop.ru/assets/programma-dlya-dostupa-k-sistemnim-faylam-android.html
best prices generic cialis 20 mg

xtaletjngyxtaletjngy2018/08/05 18:47<a href="http://baymontelreno.com">buy generic cialis online canada</a> buy cialis canada http://baymontelreno.com

ltaletjuhdltaletjuhd2018/08/06 00:18<a href="http://lizlarssen.com">purchase viagra online</a> viagra from canada http://lizlarssen.com

rtaletmzwurtaletmzwu2018/08/06 06:16<a href="http://rabbitinahat.com">buy cheapest cialis online</a> cheap cialis online canadian pharmacy http://rabbitinahat.com

ptaletdprmptaletdprm2018/08/06 11:43<a href="http://bakerssign.com">over the counter levitra</a> www levitra http://bakerssign.com

mtaletyqaumtaletyqau2018/08/06 12:22<a href="http://bakerssign.com">how long does levitra 20 mg last</a> levitra side effect http://bakerssign.com

utaletsivnutaletsivn2018/08/07 10:31<a href="http://istanbulexpressonline.com">order viagra softtabs</a> cheap generic viagra online pharmacy http://istanbulexpressonline.com

otaletvgfgotaletvgfg2018/08/08 01:32<a href="http://mphasset.com">viagra online usa</a> order viagra softtabs http://mphasset.com

xtaletcluaxtaletclua2018/08/08 06:59<a href="http://missreplicawatches.com">cialis 5mg online</a> how to order cialis online safely http://missreplicawatches.com

GlennhenueGlennhenue2018/08/08 12:51cialis going generic in 2017 in usa
cialis 20mg price
onhoxte@mail.ru
maximum dose of cialis at a time

rtaletmosbrtaletmosb2018/08/18 06:35<a href="http://mphasset.com">is there viagra for women</a> does viagra last longer http://mphasset.com

rtaletyzakrtaletyzak2018/08/18 09:55<a href="http://gigawatt6.com">when does cialis go generic</a> cialis online canada reviews http://gigawatt6.com

ytaletodhsytaletodhs2018/08/18 11:56<a href="http://bullsac.com">levitra side effect</a> levitra and high blood pressure http://bullsac.com

ztaletgrjoztaletgrjo2018/08/18 16:23<a href="http://psychologytweets.com">canadian drugs cialis</a> cialis 5 mg online http://psychologytweets.com

htaletkmnbhtaletkmnb2018/08/18 18:56<a href="http://mphasset.com">liquid viagra reviews</a> is it ok to take viagra http://mphasset.com

gtaletbgvlgtaletbgvl2018/08/18 23:25<a href="http://missreplicawatches.com">is cialis generic yet</a> cheap viagra cialis http://missreplicawatches.com

gtaletojwpgtaletojwp2018/08/19 02:37<a href="http://rabbitinahat.com">how to take cialis 20mg</a> cialis tablet picture http://rabbitinahat.com

italetatbcitaletatbc2018/08/19 07:49<a href="http://psychologytweets.com">is cialis safe with high blood pressure</a> long term cialis http://psychologytweets.com

etaletnfqdetaletnfqd2018/08/19 10:38<a href="http://baymontelreno.com">cialis for bph insurance coverage</a> side effects of cialis daily http://baymontelreno.com

jtaletxcfejtaletxcfe2018/08/19 13:26<a href="http://gigawatt6.com">cialis for sale online</a> get cialis cheap http://gigawatt6.com

ttaletfymhttaletfymh2018/08/19 16:57<a href="http://gigawatt6.com">when to take cialis 5mg</a> what do cialis pills look like http://gigawatt6.com

ktaletxjdxktaletxjdx2018/08/19 19:48<a href="http://missreplicawatches.com">cialis price at walmart</a> cialis 5mg effectiveness http://missreplicawatches.com

btaletodeubtaletodeu2018/08/20 00:55<a href="http://bullsac.com">levitra coupon 3 free pills</a> viagra versus cialis versus levitra http://bullsac.com

qtaletcwhsqtaletcwhs2018/08/20 03:52<a href="http://psychologytweets.com">taking levitra and cialis together</a> cialis 24 hours http://psychologytweets.com

wtaletgsdiwtaletgsdi2018/08/20 06:55<a href="http://psychologytweets.com">cialis and levitra taken together</a> cialis copay http://psychologytweets.com

ctaletrvpmctaletrvpm2018/09/11 10:24<a href="http://rabbitinahat.com">side effects cialis</a> cialis non prescription http://rabbitinahat.com

htaletmphhhtaletmphh2018/09/11 13:48<a href="http://mphasset.com">viva viagra</a> can you buy viagra over the counter in australia http://mphasset.com

vtaletylalvtaletylal2018/09/11 15:14<a href="http://istanbulexpressonline.com">famale viagra</a> my viagra story http://istanbulexpressonline.com

mtaletcaegmtaletcaeg2018/09/11 19:58<a href="http://mphasset.com">what is viagra medicine</a> homemade viagra shake with no pills http://mphasset.com

ctaletsovxctaletsovx2018/09/11 20:28<a href="http://mphasset.com">buy viagra belgium</a> best otc alternative to viagra http://mphasset.com

ntaletfigkntaletfigk2018/09/12 04:08<a href="http://buycialisonl1ne.us">cheap cialis india</a> cheap cialis online india http://buycialisonl1ne.us

ttaletmmvzttaletmmvz2018/09/12 06:54<a href="http://canadian-pharmasale.com">buy cialis online pharmacy</a> buy brand cialis http://canadian-pharmasale.com

wtaletkxduwtaletkxdu2018/09/12 07:13<a href="http://usedrestaurantequipmentaz.com">order cialis in usa</a> cialis online coupon http://usedrestaurantequipmentaz.com

ataletuionataletuion2018/09/12 10:35<a href="http://buycialisonl1ne.us">canadian cialis online</a> cheap cialis tablets http://buycialisonl1ne.us

ftaletzhmnftaletzhmn2018/09/12 11:45<a href="http://h-m-j.com">mail order viagra uk</a> cheap viagra sydney http://h-m-j.com

ptalethsghptalethsgh2018/09/12 16:06<a href="http://motechautomotive.com">cheap cialis canadian</a> cialis online usa http://motechautomotive.com

htaletrrrmhtaletrrrm2018/09/12 18:42<a href="http://buycialisonlineglka.com">order cialis canada</a> mail order cialis online http://buycialisonlineglka.com

dtaletacnmdtaletacnm2018/09/12 19:35<a href="http://buyviagraonl1ne.us">discount viagra online</a> generic viagra sildenafil http://buyviagraonl1ne.us

ptaletutcoptaletutco2018/09/12 23:21<a href="http://timsbmw.com">levitra prices walmart</a> what is the drug levitra used for http://timsbmw.com

otaletrqluotaletrqlu2018/09/12 23:25<a href="http://baymontelreno.com">cheap cialis in australia</a> cialis coupon http://baymontelreno.com

ytalethyuuytalethyuu2018/09/13 01:22<a href="http://gigawatt6.com">best generic cialis</a> buy cialis canada http://gigawatt6.com

italetvfqditaletvfqd2018/09/13 02:33<a href="http://h-m-j.com">viagra pill</a> buy viagra without prescription http://h-m-j.com

gtaletmebagtaletmeba2018/09/13 02:37<a href="http://rabbitinahat.com">discount cialis online</a> order 5mg cialis online http://rabbitinahat.com

wtalethfmfwtalethfmf2018/09/13 06:22<a href="http://viciolatino.com">where can you buy viagra</a> viagra online canadian pharmacy http://viciolatino.com

dtaletifspdtaletifsp2018/09/13 07:32<a href="http://buycialisonl1ne.us">real cialis online</a> order cialis online with mastercard http://buycialisonl1ne.us

htaletrjuahtaletrjua2018/09/13 12:48<a href="http://valladium.com">buy cialis online with paypal</a> order cialis pills online http://valladium.com

ftaletsmrmftaletsmrm2018/09/13 17:35<a href="http://buycialisonlineglka.com">cialis coupons</a> order cialis now http://buycialisonlineglka.com

xtaletwwcjxtaletwwcj2018/09/13 21:27<a href="http://valladium.com">cheap cialis usa</a> cialis online canada cheap http://valladium.com

ltaletrbqnltaletrbqn2018/09/13 23:17<a href="http://viciolatino.com">generic viagra soft</a> order viagra pills http://viciolatino.com

btalettlqobtalettlqo2018/09/14 01:28<a href="http://bullsac.com">levitra 20 mg</a> levitra heartburn http://bullsac.com

ltaletmryqltaletmryq2018/09/14 04:35<a href="http://gigawatt6.com">cheap cialis soft tabs</a> generic cialis 100mg http://gigawatt6.com

ltaletioypltaletioyp2018/09/14 06:22<a href="http://motechautomotive.com">generic cialis for order</a> buy cheap cialis 20mg http://motechautomotive.com

dtalettzmmdtalettzmm2018/09/14 08:44<a href="http://valladium.com">generic cialis usa</a> cialis online india http://valladium.com

ztaletqcwaztaletqcwa2018/09/14 10:26<a href="http://missreplicawatches.com">cialis 5 mg online</a> order cialis without prescription http://missreplicawatches.com

otaletrjayotaletrjay2018/09/14 15:25<a href="http://usedrestaurantequipmentaz.com">best generic cialis</a> cheap cialis generic india http://usedrestaurantequipmentaz.com

italetfjobitaletfjob2018/09/14 17:20<a href="http://bullsac.com">levitra coupon free trial</a> levitra high blood pressure http://bullsac.com

utaletwxrhutaletwxrh2018/09/14 20:14<a href="http://gigawatt6.com">generic cialis online usa</a> cheap cialis soft tabs http://gigawatt6.com

italetpxuhitaletpxuh2018/09/15 00:14<a href="http://valladium.com">order discount cialis online</a> cialis pills http://valladium.com

gtaletahgagtaletahga2018/09/15 00:59<a href="http://gigawatt6.com">buy generic cialis online</a> order cialis overnight delivery http://gigawatt6.com

vtaletdzhivtaletdzhi2018/09/15 03:46<a href="http://missreplicawatches.com">cialis canada order</a> canadian pharmacy cialis generic http://missreplicawatches.com

ktalethsqnktalethsqn2018/09/15 05:02<a href="http://valladium.com">order cialis europe</a> buy cialis online safely http://valladium.com

ktaletaevmktaletaevm2018/09/15 06:57<a href="http://bullsac.com">generic levitra no prescription</a> best price on levitra http://bullsac.com

gtaletirhdgtaletirhd2018/09/15 12:38<a href="http://canadian-pharmasale.com">cialis canada order</a> buy cialis 5mg http://canadian-pharmasale.com

ttaletqodzttaletqodz2018/09/15 15:33<a href="http://buycialisonlineglka.com">discount generic cialis</a> cialis 20mg price http://buycialisonlineglka.com

vtaletotknvtaletotkn2018/09/15 17:49<a href="http://vico4me.com">cheap price viagra</a> cheap viagra online usa http://vico4me.com

italetaqguitaletaqgu2018/09/15 21:25<a href="http://canadian-pharmaonline.com">cheap generic viagra</a> order viagra cheap http://canadian-pharmaonline.com

ctaletslhkctaletslhk2018/09/15 21:45<a href="http://bullsac.com">side effects of levitra</a> levitra cost http://bullsac.com

rtaletxcwvrtaletxcwv2018/09/15 22:55<a href="http://timsbmw.com">compare cialis viagra levitra</a> cheap levitra professional http://timsbmw.com

mtaletrgjjmtaletrgjj2018/09/16 01:41<a href="http://canadian-pharmabuy.com">generic viagra online usa</a> best generic viagra online http://canadian-pharmabuy.com

ftaletnlebftaletnleb2018/09/16 03:09<a href="http://missreplicawatches.com">cheap cialis usa</a> cialis online us pharmacy http://missreplicawatches.com

rtaletxkbcrtaletxkbc2018/09/16 05:00<a href="http://bullsac.com">what do levitra pills look like</a> levitra 20 http://bullsac.com

vtaletjdmvvtaletjdmv2018/09/16 18:11<a href="http://usedrestaurantequipmentaz.com">best online cialis</a> cheap cialis prices uk http://usedrestaurantequipmentaz.com

italetgcpiitaletgcpi2018/09/16 18:33<a href="http://timsbmw.com">when will levitra be generic</a> how long is levitra effective http://timsbmw.com

ttaletulxbttaletulxb2018/09/17 01:11<a href="http://unishade.com">generic cialis online usa</a> best place to buy generic cialis http://unishade.com

ataletpqmzataletpqmz2018/09/17 03:09<a href="http://top-monterey-salinas-dentists.com">levitra dosage how long does it last</a> how to take levitra http://top-monterey-salinas-dentists.com

jtalettraljtalettral2018/09/17 04:53<a href="http://baymontelreno.com">cialis 20 mg</a> cheap cialis 60 mg http://baymontelreno.com

dtaletzaaedtaletzaae2018/09/17 08:48<a href="http://viciolatino.com">order viagra pills</a> cheapest viagra online http://viciolatino.com

utaletfwhnutaletfwhn2018/09/17 10:35<a href="http://missreplicawatches.com">how to order cialis from canada</a> cheap brand cialis http://missreplicawatches.com

ktaletkabaktaletkaba2018/09/17 17:30<a href="http://buyviagraonl1ne.us">viagra without prescription</a> buy real viagra online http://buyviagraonl1ne.us

ztaletgrvfztaletgrvf2018/09/17 21:10<a href="http://h-m-j.com">buy viagra without a prescription</a> viagra online without prescription http://h-m-j.com

ctalettlbgctalettlbg2018/09/17 22:07<a href="http://missreplicawatches.com">cialis canada order</a> order cialis online without prescription http://missreplicawatches.com

wtaletywpmwtaletywpm2018/09/18 03:50<a href="http://top-monterey-salinas-dentists.com">buy levitra</a> is cialis better than levitra http://top-monterey-salinas-dentists.com

ataletaltiataletalti2018/09/18 04:05<a href="http://unishade.com">buy cialis overnight delivery</a> buy cialis in canada http://unishade.com

italetiecritaletiecr2018/09/18 17:44<a href="http://canadian-pharmasale.com">cialis online prescription</a> buy cheap cialis 20mg http://canadian-pharmasale.com

htaletuyzohtaletuyzo2018/09/18 18:00<a href="http://valladium.com">cialis online us pharmacy</a> buy cialis online in usa http://valladium.com

xtaletgrxkxtaletgrxk2018/09/18 19:11<a href="http://istanbulexpressonline.com">order cheap female viagra</a> cheap viagra 100mg http://istanbulexpressonline.com

htaletcwfshtaletcwfs2018/09/19 00:05<a href="http://buycialisonl1ne.us">cheap cialis online uk</a> order cialis usa http://buycialisonl1ne.us

ataletpohoataletpoho2018/09/19 03:43<a href="http://canadian-pharmabuy.com">viagra online paypal</a> order viagra now http://canadian-pharmabuy.com

vtaletjtvevtaletjtve2018/09/19 04:00<a href="http://canadian-pharmasale.com">cialis 5 mg</a> cialis cheap online pharmacy http://canadian-pharmasale.com

jtaletujucjtaletujuc2018/09/19 07:56<a href="http://missreplicawatches.com">cialis price</a> cialis originale online http://missreplicawatches.com

otaletpgtwotaletpgtw2018/09/19 12:13<a href="http://valladium.com">generic cialis online</a> cialis 20mg http://valladium.com

ptaletzxmvptaletzxmv2018/09/19 16:55<a href="http://missreplicawatches.com">order cialis pills</a> cheap cialis in uk http://missreplicawatches.com

rtaletkzowrtaletkzow2018/09/19 19:17<a href="http://baymontelreno.com">cheapest generic cialis online</a> buy cialis usa http://baymontelreno.com

vtaletigwnvtaletigwn2018/09/19 20:02<a href="http://buycialisonl1ne.us">cialis pills online</a> cialis pills sale http://buycialisonl1ne.us

jtaletvnnjjtaletvnnj2018/09/19 23:44<a href="http://canadian-pharmaonline.com">cheap indian viagra</a> purchase viagra online http://canadian-pharmaonline.com

ytaletzbiaytaletzbia2018/09/19 23:59<a href="http://buycialisonl1ne.us">cialis online canada cheap</a> buy cialis online in usa http://buycialisonl1ne.us

xtaletcljfxtaletcljf2018/09/20 02:11<a href="http://buycialisonl1ne.us">generic cialis in canada</a> cialis 5 mg online http://buycialisonl1ne.us

dtaletduzpdtaletduzp2018/09/20 03:42<a href="http://unishade.com">generic cialis 60 mg</a> order cialis paypal http://unishade.com

ptaletwrbeptaletwrbe2018/09/20 04:30<a href="http://canadian-pharmasale.com">order cialis using paypal</a> cialis mail order india http://canadian-pharmasale.com

italetfdlyitaletfdly2018/09/20 08:16<a href="http://valladium.com">cheap cialis uk</a> order cialis from india http://valladium.com

btaletpgybbtaletpgyb2018/09/20 11:24<a href="http://motechautomotive.com">buy cialis canadian pharmacy</a> order cialis online without prescription http://motechautomotive.com

otaletnrqmotaletnrqm2018/09/20 11:46<a href="http://canadian-pharmasale.com">order 5mg cialis online</a> cialis 20mg http://canadian-pharmasale.com

vtaletyvobvtaletyvob2018/09/20 15:08<a href="http://rabbitinahat.com">buy cialis online without prescription</a> cheap brand cialis online http://rabbitinahat.com

2008-12-21

Monad,Functor,Applicative Monad,Functor,Applicative - 他人のHaskell日記 を含むブックマーク

  • <*> とap
  • pureとreturn
  • fmapと<$>とliftM
  • *> と >>

って全部一緒?

だとすると、

たとえば、

do v1 <- proc1

v2 <- proc2

return (v1, v2)

という処理があるとしよう。これはこう書ける。

pure (,) <*> proc1 <*> proc2

すげースッキリする。さらに、先頭が pure の場合にはまた別の演算子もあり、

(,) <$> proc1 <*> proc2

と書けばよい。ふーむ。いろいろ書けそうだ!

http://haskell.g.hatena.ne.jp/jmk/20061130

liftM2 (,) proc1 proc2でもいいのかな。

Applicativeを使ってみる。  Applicativeを使ってみる。 - 他人のHaskell日記 を含むブックマーク

テキスト正規化トラバース1回バージョン(http://ja.doukaku.org/comment/8234/)をApplicativeとReaderモナドで書き直してみる。

import Control.Monad.Reader
import Control.Applicative
test = "hoge\nPOPOPOPOPO\n\nPINGPONG\n"

padding' :: String->Int->Int->Reader Char (Int,String)
padding' []         i  m = return (0,[])
padding' ('\n':xs)  i  m = do (cMax,cStr) <- padding' xs 0 (max i m) 
                              padStr      <- padding'' ((max cMax m) -i)  
                              return (max m cMax,padStr++cStr)
padding' (x:xs)     i  m =  (\(cMax,cStr)->(max m cMax,x:cStr)) <$> padding' xs (i+1) (max i m) 

padding'' :: Int->Reader Char String
padding'' n = (++ "\n").replicate n  <$> ask

padding text ch = snd $ runReader (padding' text 0 0) ch

はじめて使うjoin  はじめて使うjoin - 他人のHaskell日記 を含むブックマーク

do v1 <- proc1

v2 <- proc2

finalProc v1 v2

な場合にはうまくないな。

http://haskell.g.hatena.ne.jp/jmk/20061130

join使えばいけるようです。

import Control.Monad
import Control.Applicative
import Data.Char

main = join $ printLines <$> getLine <*> getLine

printLines a b = mapM_ (putStrLn.map toUpper) [a,b]

あるいは

main = join $ liftM2 printLines getLine getLine

てな感じで。

haskell-jp [1-150]

IOモナドについて

Q http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/53

A http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/54

テスト手法について

論点の整理 http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/102

QuickCheck+Darcs,undefinedを使う方法

http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/128

関連エントリ


GHC 6.8.1

http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/138

Flymake-Haskell

http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/140

http://madscientist.jp/~ikegami/diary/20071108.html#p01

http://www.emacswiki.org/cgi-bin/emacs/FlymakeHaskell

HaRe

http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/106

Haskell用のリファクタリングツール

http://www.cs.kent.ac.uk/projects/refactor-fp/hare.html

do記法で再帰モナド

http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/143

http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/144

http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/146

相互参照がある場合は

http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/147

遅延パターンを使えばいい

その他のツール  その他のツール - 他人のHaskell日記 を含むブックマーク

HLintは、Haskell Programの一般的な間違いを見つけだすツール

$ hlint darcs-2.1.2

darcs-2.1.2\src\CommandLine.lhs:46:1: Use a string literal
Found:
  [' ', '\t', '"', '%']
Why not:
  " \t\"%"

darcs-2.1.2\src\CommandLine.lhs:49:1: Eta reduce
Found:
  quotedArg ftable
    = between (char '"') (char '"') $ quoteContent ftable
Why not:
  quotedArg = between (char '"') (char '"') . quoteContent

darcs-2.1.2\src\CommandLine.lhs:94:1: Use concatMap
Found:
  concat $ map escapeC s
Why not:
  concatMap escapeC s

darcs-2.1.2\src\CommandLine.lhs:103:1: Use fewer brackets
Found:
  ftable ++ (map (\ (c, x) -> (toUpper c, urlEncode x)) ftable)
Why not:
  ftable ++ map (\ (c, x) -> (toUpper c, urlEncode x)) ftable

darcs-2.1.2\src\Darcs\Patch\ReadMonads.hs:61:29: Use const
Found:
  \ _ -> Nothing
Why not:
  const Nothing

no title

HAT (Haskell Tracer)

4: dimagekidimageki   Hat

Hat - the Haskell Tracer http://www.haskell.org/hat/

というのがあります。
Hat をインストールする

洗練された Linux distribution を使えば簡単ですが、そうでないひとは

   1. ghc http://www.haskell.org/ghc/ をインストール
   2. hmake http://www.cs.york.ac.uk/fp/hmake/ をインストール
   3. hat をインストール

の手順で導入する必要があります。

hmake は ghc でないコンパイラもサポートしていますが、hat を使うなら

ghc で十分だと思われます。

hat 2.04 の configure にはバグがあります。もしもインストールに失敗したら

    * lib/YOUR_PLATFORM/config の GHCSYM= の行を編集
          o 余計な改行をとりのぞき、 GHCSYM=604 にする
    * src/hatlib/Makefile の CPPFLAGS を編集
          o 該当行の ghcsym を cat している部分を 604 を代入することに変える

ことで、成功するかもしれません。
Hat を使う

   1. ソースを書く
         1. トレースは main 実行時に作られるので、中身を見たい関数を main で評価する
   2. 実行ファイルを作る
         1. hmake -hat progname
         2. progname はファイル名から.hs をのぞいた名前を指定すること
         3. プログラム progname ができあがるので実行
   3. hat-observe progname

hat-observe の使い方は hat のページにマニュアルがあります。

ためしに square(3+4) の例をやってみると次のようになります。

    -- Sample.hs

    main = do print (show foo)

    return ()

    foo :: Int

    foo = square (3+4)

    square :: Int -> Int

    square x = x * x

    % hmake -hat Sample

    % ./Sample

    % hat-observe Sample

    hat-observe 2.04 (:? for help, :q to quit)

    hat-observe> square

    square 7 = 49

    hat-observe>

hat のページにパターンマッチの展開の具体例が載っています。

Debug.Traceの使い方

Page not found · GitHub Pages

no title

Pharmd255Pharmd2552012/01/01 05:47 Hello! eeeadck interesting eeeadck site! I'm really like it! Very, very eeeadck good!

Pharme251Pharme2512012/01/01 05:47Very nice site! <a href="http://oieapxy.com/tyxqqt/1.html">cheap viagra</a>

Pharma748Pharma7482012/01/01 05:48Very nice site! [url=http://oieapxy.com/tyxqqt/2.html]cheap cialis[/url]

Pharme548Pharme5482012/01/01 05:48Very nice site! cheap cialis http://oieapxy.com/tyxqqt/4.html

Pharma917Pharma9172012/01/01 05:49Very nice site!

Pharmf968Pharmf9682012/01/26 00:21 Hello! bffeecc interesting bffeecc site! I'm really like it! Very, very bffeecc good!

Pharme82Pharme822012/01/26 00:22Very nice site! <a href="http://apxoiey.com/aoarvx/1.html">cheap viagra</a>

Pharmd37Pharmd372012/01/26 00:22Very nice site! [url=http://apxoiey.com/aoarvx/2.html]cheap cialis[/url]

Pharme874Pharme8742012/01/26 00:23Very nice site!

Pharma726Pharma7262012/06/11 01:29 Hello! ceeedea interesting ceeedea site! I'm really like it! Very, very ceeedea good!

Pharmd200Pharmd2002012/06/11 01:29Very nice site! <a href="http://opxaiey.com/oyyxxky/1.html">cheap viagra</a>

Pharmk452Pharmk4522012/06/11 01:30Very nice site! [url=http://opxaiey.com/oyyxxky/2.html]cheap cialis[/url]

Pharma535Pharma5352012/06/11 01:30Very nice site! cheap cialis http://opxaiey.com/oyyxxky/4.html

Pharmd794Pharmd7942012/06/11 01:31Very nice site!

シアリスシアリス2012/11/29 16:06シアリスの個人輸入代行http://xn--ed-gg4aodl70a.com/
シアリススーパーアクティブの主成分はタダラフィルです。勃起不全の治療を目的としたED経口治療薬です。
シアリススーパーアクティブ販売 シアリススーパーアクティブ購入 シアリススーパーアクティブ通販http://xn--ed-gg4aodl70a.com/cialis_superactive.html確実にシアリススーパーアクティブをお届けしております。

WomeraWomera2013/03/28 16:22女性用バイアグラWomeraがどのように開発されたのか
また、どのように身体、精神に影響を及ぼすのか
女性用バイアグラ Womera http://xn--cckd1b8h6e.cc/445 <a href=” http://xn--cckd1b8h6e.cc/445 ”>女性用バイアグラWomera</a> [url=http://xn--cckd1b8h6e.cc/445]女性用バイアグラWomera[/url]

lzyalgjcvmlzyalgjcvm2013/11/24 03:09qbsrcibtlfmm, <a href="http://www.ymwwdxvtwl.com/">ahunsodnwr</a> , [url=http://www.xmzlbwpuzp.com/]wvpcycknjq[/url], http://www.lowrdhehwf.com/ ahunsodnwr

zimfccgwzizimfccgwzi2014/04/13 04:11dmcmxibtlfmm, <a href="http://www.xaaivwmoek.com/">jxpcympinj</a> , [url=http://www.zchhkymuur.com/]vyptarwibt[/url], http://www.mfzkaqraij.com/ jxpcympinj

lasix no script lasix no script 2019/03/24 05:30good site absolutely neighbourly articles. reckon bookmarks

BrentCOEVEBrentCOEVE2019/03/24 11:45genuine place hugely neighbourly articles. add bookmarks

BrentCOEVEBrentCOEVE2019/03/24 13:59a-ok spot hugely caring articles. add bookmarks

Katia77EasemKatia77Easem2019/03/24 15:01generic levitra 40 mg buy generic levitra online <a href="http://levitrax20.com/ ">levitra 10mg </a> - link

BrentCOEVEBrentCOEVE2019/03/24 16:10a-ok site very cooperative articles. sum bookmarks

BrentCOEVEBrentCOEVE2019/03/24 18:18genuine site absolutely caring articles. combine bookmarks

BrentCOEVEBrentCOEVE2019/03/24 20:26genuine spot sheer cooperative articles. sum bookmarks

CialisBawsCialisBaws2019/03/24 22:29Mammoth site. Literate articles. Thanks to author. Save your website as a favorite

CialisBawsCialisBaws2019/03/24 23:49Mammoth site. Literate articles. Thanks to author. Salvage your website as a favorite

SaniaEasemSaniaEasem2019/03/25 03:19Hi! by my website 622

Ryt44a77EasemRyt44a77Easem2019/03/25 08:53levitra for sale online go here <a href="http://levitrax20.com/# ">levitra sale </a>

Ryt44a77EasemRyt44a77Easem2019/03/26 02:08viagra generic where to buy viagra http://viagpills.com/

2008-12-20

groupByの変な使い方。  groupByの変な使い方。 - 他人のHaskell日記 を含むブックマーク

自然数をn桁の数ごとに分割する

 groupBy (\a b-> a*10 > b) [1..120]

[[1,2,3,4,5,6,7,8,9],
[10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,
 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
 70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,
 90,91,92,93,94,95,96,97,98,99],
[100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120]]

2個づつ分割する。

 groupBy (const even) [1..20]
[[1,2],[3,4],[5,6],[7,8],[9,10],[11,12],[13,14],[15,16],[17,18],[19,20]]

2個1個の順に分割する。


 groupBy (\a b-> mod (a+b) 3==0) [1..20]
[[1,2],[3],[4,5],[6],[7,8],[9],[10,11],[12],[13,14],[15],[16,17],[18],[19,20]]

1個2個4個8個の順に分割する。


 groupBy (\a b-> a*2 > b ) [1..20]
[[1],[2,3],[4,5,6,7],[8,9,10,11,12,13,14,15],[16,17,18,19,20]]

いや、

いつつかうんだ、こんなの。

更に追加  更に追加 - 他人のHaskell日記 を含むブックマーク

指定した奴以外はひとまとめ。

指定したものも同じ数が並んだときはまとめる。

test = [3,6,10,11,16,20]
 groupBy (\a b->elemIndex a test == elemIndex b test) [1..25]
[[1,2],[3],[4,5],[6],[7,8,9],[10],[11],[12,13,14,15],[16],[17,18,19],[20],[21,22,23,24,25]]
 groupBy (\a b->elemIndex a test == elemIndex b test) [1,2,3,3,4,5,6,7]
[[1,2],[3,3],[4,5],[6],[7]]

数を身長とみなせば

4に見えているのは5の背中、

その5に見えているのは8の背中

その8に見えているのは9の背中

groupBy (\a b-> a>=b) [4,2,3,4,3,2,5,8,9,2,3,5,6]
[[4,2,3,4,3,2],[5],[8],[9,2,3,5,6]]

intersectBy intersectBy - 他人のHaskell日記 を含むブックマーク

2,3,5,7,11,13のいずれかで割り切れるものを排除。

 intersectBy (\a b-> mod a b ==0) [14..100] [2,3,5,7,11,13]
[14,15,16,18,20,21,22,24,25,26,27,28,30,32,33,34,35,36,38,39,
40,42,44,45,46,48,49,50,51,52,54,55,56,57,58,60,62,63,64,65,
66,68,69,70,72,74,75,76,77,78,80,81,82,84,85,86,87,88,90,91,
92,93,94,95,96,98,99,100]

 [14..100] \\ it
[17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]

ある文字の種類のみ受けつけるフィルターとしても使える


intersect "abcDEFghiJKLmnopPRStuVwxYz" ['a'..'z']
"abcghimnoptuwxz"

二つ目に指定するリストの要素から誤差1つ以内の要素を取り出す

intersectBy (\a b-> abs (a - b)<=1) [1..100] [2,18,45,89]
[1,2,3,17,18,19,44,45,46,88,89,90]

intersectBy (当たり判定) [味方のユニット] [敵の弾] = [死亡する味方のユニット]

みたいな使い方はどうだろう。intersectも奥が深い気がしてきたぞ。

次の課題はUnionByだ。

RylBeaubsRylBeaubs2018/01/30 10:36Fluoxetine Uk Buy Dutasteride Us Secure Ordering Fedex Shipping Amex Secure Zentel 400mg Ups In Canada Pharmacy <a href=http://cialiviag.com>buy cialis</a> Can You Take Ibuprofen With Amoxicillin Canadian Pharmacy Mall

eihegeguloweihegegulow2018/02/21 18:41http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

olozazunolozazun2018/02/21 18:46http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

puhozuiripuhozuiri2018/02/21 18:48http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

awyegogiawyegogi2018/02/21 18:57http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

ijohothagetoijohothageto2018/02/21 19:02http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

iqokehaiqokeha2018/02/21 19:14http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

epezawunagepezawunag2018/02/21 19:20http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

iigewuupuiigewuupu2018/02/21 19:30http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

uqvubawenuqvubawen2018/02/21 19:36http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

imeoriyadimeoriyad2018/02/21 19:48http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

ujivihimiremujivihimirem2018/02/21 19:54http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

ijotaeiomijotaeiom2018/02/21 20:04http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

MatdeceMatdece2018/04/27 22:55Lioresal Acheter En Canada Buy Lipitor Online With No Prescription Priligy Interacciones <a href=http://cheapciali.com>canadian cialis</a> Rx Customer Support Donde Comprar Cialis Seguro Mavidol

DerekenuptDerekenupt2018/05/30 14:51dating <a href= http://babblepay.ru/ > online </a> here "http://yubmodule.ru/" - dating site http://myloot.ru/

MatdeceMatdece2018/06/18 04:40Finpecia Order Flagyl Online For Women Generico Levitra Online Vardenafil <a href=http://ciali5mg.com>cialis price</a> Cialis 20 Acheter Deltaenterprisesviagra

MatdeceMatdece2018/09/03 16:45Comprar Cialis Generico 10 Mg No Rx Dog Cephalexin <a href=http://cialviag.com>generic cialis overnight delivery</a> Achat Kamagra Grenoble Kaufen Cialis 20mg Levitra Belgien Kaufen

JospehOwexyJospehOwexy2019/02/02 02:51cialis professional new zealand
buy cialis wholesale
cialis 10 generic without perscription
cialis cost per tablet

buy generic cialis super active
schweiz cialis online bestellung
cheap reliable cialis
buy cialis express shipping
https://stowe365.com/#Buy-Cialis

WilliamButWilliamBut2019/02/02 09:55cialis for sale glendale ca
cialis professional belgique libre
<a href=https://greatwinesgrandhouses.com>buy Cialis 20 mg</a>
cialis with priligy
cialis 100mg in deutschland kaufen
https://kellyannehulme.com
cialis 20mg forum
farmacia online affidabile cialis
<a href=https://kellyannehulme.com>buy cialis</a>
cialis 20mg price comparison
cialis supplies in norfolk uk
https://greatwinesgrandhouses.com

WilliamButWilliamBut2019/02/02 09:55buying cialis in kuala lumpur
cialis drug class
<a href=https://kellyannehulme.com>buy Cialis 20 mg</a>
sildenafil vs cialis
does cialis daily work better
https://kellyannehulme.com
japanese cialis baolong
discount generic cialis online
<a href=https://kellyannehulme.com>buy Cialis 20 mg</a>
is it illegal to buy cialis from canada
lloyds pharmacy cialis 20mg
https://kellyannehulme.com

WilliamButWilliamBut2019/02/02 09:55cialis online nabp
cheapest generic cialis no prescription
<a href=https://kellyannehulme.com>buy Cialis 20 mg</a>
cheapest cialis dosage 20mg price
coupons for cialis
https://greatwinesgrandhouses.com
cialis 5 mg film coated tablets
buy cialis forum
<a href=https://kellyannehulme.com>Cialis 20 mg cheap price</a>
buy cialis aus
cialis buy on craigslist legal
https://kellyannehulme.com

WilliamButWilliamBut2019/02/02 09:56ordercialis by check
best prices on cialis in toronto
<a href=https://kellyannehulme.com>Cialis 20 mg</a>
buy cialis shoppers drug mart
cialis sans ordonnance
https://kellyannehulme.com
daily cialis is it better
cialis 4cpr riv 10mg costo
<a href=https://kellyannehulme.com>20 mg cialis buy</a>
cialis tienda online
cialis con
https://kellyannehulme.com

ArnoldmefArnoldmef2019/02/05 17:59lowest cost cialis
over the counter meds like cialis
<a href="http://cialisfurr.com">Buy Cialis Online</a>
cialis online pharmacy reviews
cialis 10mg preis
<a href="http://xcialisxx.com">Buy Cheap Cialis Online</a>
comprar cialis indio en espana
cialis generika online kaufen ohne rezept
<a href="http://cialistlm.com">Buy Cialis Online</a>

ArnoldmefArnoldmef2019/02/05 17:59cialis side effects alcohol
micardis 80mg cialis 10mg interactions
<a href="http://cialisfurr.com">Cheap Cialis</a>
best generic cialis website
order cialis online fast shipping
<a href="http://cialisfurr.com">buy cialis</a>
cialis super plus australia non generic
us federal law on cialis online
<a href="http://cialistlm.com">Cheap Cialis</a>

ArnoldmefArnoldmef2019/02/05 17:59geneic cialis
buy cialis hong kong
<a href="http://cialisfurr.com">Cheap Cialis buy</a>
us made cialis
will cialis get you hard
<a href="http://cialistlm.com">Cheap Cialis buy</a>
cialis lilly brand pills
daly cialis canada
<a href="http://cialistlm.com">Cheap Cialis buy</a>

ArnoldmefArnoldmef2019/02/05 18:00cialis plux dapoxetine online ordering
costco price for cialis
<a href="http://cialistlm.com">buy cialis</a>
cialis reviews 10mg
buy cialis no prescription australia
<a href="http://xcialisxx.com">Cheap Cialis buy</a>
walmart pharmacy cialis
cialis cheapest lowest price usa
<a href="http://cialisfurr.com">Buy Cheap Cialis</a>

ArnoldmefArnoldmef2019/02/05 18:01cialis verschreibungspflichtig
price cialis boots
<a href="http://cialistlm.com">Cheap Cialis buy</a>
cheap cialis no prescription
what is liquid cialis online
<a href="http://cialisfurr.com">buy cialis</a>
get cialis on line
cialis afhalen
<a href="http://xcialisxx.com">Buy Cheap Cialis</a>

DouglasRixDouglasRix2019/02/08 02:39http://sdfgdfsgfdhfgjkur.com/
<a href=http://sdfgdfsgfdhfgjkur.com/#>cialis softabs</a>
<a href="http://sdfgdfsgfdhfgjkur.com/#">buy cheap cialis generic levitra viagra</a>

uneopufipagimuneopufipagim2019/04/21 02:34http://theprettyguineapig.com/amoxicillin/ - Buy Amoxicillin Online <a href="http://theprettyguineapig.com/amoxicillin/">Buy Amoxicillin</a> azx.vdiu.haskell.g.hatena.ne.jp.esx.jl http://theprettyguineapig.com/amoxicillin/

iyuvadarokiyuvadarok2019/04/21 02:57http://theprettyguineapig.com/amoxicillin/ - Amoxicillin 500mg Capsules <a href="http://theprettyguineapig.com/amoxicillin/">Amoxicillin</a> eqf.tltg.haskell.g.hatena.ne.jp.hta.ut http://theprettyguineapig.com/amoxicillin/

2008-12-18

brainf*ck  brainf*ck - 他人のHaskell日記 を含むブックマーク

brainf*ckのインタプリタ作ろうと思ったけど入出力がどうやればいいのかわからない。

とりあえずbrainf*ckのコードを若干見易く変換するプログラムを書いてみた。

import Data.List
bf= "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+."

g '+' 1   = "Mem[index].succ " 
g '+' cnt = "Mem[index].add " ++ show cnt
g '-' 1   = "Mem[index].pred " 
g '-' cnt = "Mem[index].subtract " ++ show cnt
g '>' 1   = "index.succ " 
g '>' cnt = "index.add " ++ show cnt
g '<' 1   = "index.pred " 
g '<' cnt = "indexsubtract " ++ show cnt
g '.' cnt = rep cnt "Mem[index].putChar" 
g ',' cnt = rep cnt "Mem[index]=Stdin.getChar" 
g '[' _ = "while Mem[index] do"
g ']' _ = "end"
g _ cnt = ""

spcs n = replicate n ' '

h []     preOp cnt spc = [(g preOp cnt)]
h (x:xs) '['   _ spc = (spcs spc ++ g '[' 1):h xs x 1 (spc+2)
h (x:xs) ']'   _ spc = (spcs (spc-2) ++ g ']' 1):h xs x 1 (spc-2)
h (x:xs) preOp cnt spc   
  |x == preOp       = h xs x (cnt + 1) spc
  |otherwise        = (spcs spc ++ g preOp cnt):h xs x 1 spc

main = putStr $ tail $ unlines $ h bf ' ' 1 0

bfの中に入ってるコードはHello worldプログラムの一覧 - WikipediaにあったHello world.

実行結果。

Mem[index].add 9
while Mem[index] do
  index.succ 
  Mem[index].add 8
  index.succ 
  Mem[index].add 11
  index.succ 
  Mem[index].add 5
  indexsubtract 3
  Mem[index].pred 
end
index.succ 
putChar Mem[index]
index.succ 
Mem[index].add 2
putChar Mem[index]
Mem[index].add 7
putChar Mem[index]
putChar Mem[index]
Mem[index].add 3
putChar Mem[index]
index.succ 
Mem[index].pred 
putChar Mem[index]
Mem[index].subtract 12
putChar Mem[index]
index.pred 
Mem[index].add 8
putChar Mem[index]
Mem[index].subtract 8
putChar Mem[index]
Mem[index].add 3
putChar Mem[index]
Mem[index].subtract 6
putChar Mem[index]
Mem[index].subtract 8
putChar Mem[index]
index.succ 
Mem[index].succ 
putChar Mem[index]

groupBy  groupBy - 他人のHaskell日記 を含むブックマーク

http://haskell.g.hatena.ne.jp/jmk/20060629/1151552627

ここを見て、いろいろ弄ってるうちに、上のを改良できる事に気がついた。

import Data.List
import Char
bf= "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+."

g '+' 1   = "Mem[index].succ " 
g '+' cnt = "Mem[index].add " ++ show cnt
g '-' 1   = "Mem[index].pred " 
g '-' cnt = "Mem[index].subtract " ++ show cnt
g '>' 1   = "index.succ " 
g '>' cnt = "index.add " ++ show cnt
g '<' 1   = "index.pred " 
g '<' cnt = "index.subtract " ++ show cnt
g '.' _ = "putChar Mem[index]" 
g ',' _ = "Mem[index]=getChar" 
g '[' _ = "while Mem[index] do"
g ']' _ = "end"
g _ cnt = ""

spcs n = replicate n ' '

h []       spc = []
h ("[":xs) spc = (spcs  spc    ++ g '['               1):h xs (spc+2)
h ("]":xs) spc = (spcs (spc-2) ++ g ']'               1):h xs (spc-2)
h (x:xs)   spc = (spcs  spc    ++ g (head x) (length x)):h xs  spc

main = putStr $ unlines $ h (groupBy f bf) 0
 where f '.' _ = False 
       f ',' _ = False 
       f '[' _ = False
       f ']' _ = False
       f  a  b = a==b

KeilaKeila2012/12/22 22:12IMHO you've got the right asnewr!

beahrnrmkbeahrnrmk2012/12/23 11:53wf5Lai <a href="http://baswwernpzse.com/">baswwernpzse</a>

ccdpyzhccdpyzh2012/12/23 16:3396d1jT , [url=http://gjaikcmiubix.com/]gjaikcmiubix[/url], [link=http://rpaqfphcpmsx.com/]rpaqfphcpmsx[/link], http://zmcmazwexqgd.com/

igjfrfroigjfrfro2012/12/23 23:48F0O4xv <a href="http://cgyvdqppgyof.com/">cgyvdqppgyof</a>

2008-12-17

SEND MORE MONEYを修正してみた。

import List
import Maybe
import Char

problem = ["SEND","MORE","MONEY"]
problemStr = nub.concat $ problem                         -- "SENDMORY"
indicesStr = concatMap (\c ->elemIndices c problemStr)    -- indicesStr "ENM" -> [1,2,4]

solve = filter test candidates
  where test candidate = let strToNum = read.map intToDigit.map (candidate!!).indicesStr 
                         in  strToNum (problem !! 0) + strToNum (problem !! 1) == strToNum (problem !! 2)

all_different = foldr (\as bss -> [ a:bs | a <- as, bs <- bss,notElem a bs]) [[]]
initialIndex = nub $ concatMap (\str -> elemIndices (head str) problemStr ) problem
candidates = all_different.removeFirsts initialIndex.replicate (length problemStr) $ [0..9]

removeFirsts indices xs = zipWith (\i x->if elem i indices then tail x else x) [0..] xs

自分で書いたくせにall_differentがどうなってんのか既にわからない。

*Main> all_different [[1,2,3],[1,2,3],[1,2,3]]
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Reader モナド  Reader モナド - 他人のHaskell日記 を含むブックマーク

上のSEND MORE MONEYではproblemを大域変数のように使っているので保守性が悪い。

そこでReaderモナドで書きなおしてみた。ちゃんと使うのははじめてなので頭に負担がかかった。

import Data.List
import Data.Maybe
import Char
import Control.Monad.Reader

problem = ["SEND","MORE","MONEY"]
strForMapping = nub.concat                         -- "SENDMORY"

indicesStr :: String -> Reader [String] [Int]
indicesStr str = do pstr <- asks strForMapping 
                    return $ mapMaybe (\c ->elemIndex c pstr) str  


solve ::Reader [String] [[Int]]
solve = do prob <-ask 
           cand <-candidates
           return $ filter (\x->runReader (test x) prob) cand
  where test :: [Int]->Reader [String] Bool
        test candidate = do let strToNum = (mapReader (read.map(intToDigit.(candidate!!)))).indicesStr
                            [a,b,c] <- sequence $ map (\i-> asks (!!i)>>=strToNum) [0,1,2]
                            return $ a + b == c

all_different ::[[Int]]->[[Int]]
all_different = foldr (\as bss -> [ a:bs | a <- as, bs <- bss,notElem a bs]) [[]]


initialIndex :: Reader [String] [Int]
initialIndex = do prob <- ask
                  pstr <- asks  strForMapping 
                  return $ nub $ mapMaybe (\str -> elemIndex (head str) pstr) prob


candidates :: Reader [String] [[Int]]
candidates = do pstr    <- asks strForMapping
                initIdx <- initialIndex
                return $ all_different.removeFirsts initIdx.replicate (length pstr) $ [0..9] 



removeFirsts :: [Int] -> [[Int]] -> [[Int]]
removeFirsts indices xs = zipWith (\i x->if elem i indices then tail x else x) [0..] xs

main = print $  runReader solve problem


solveの中のrunReaderが気持ち悪いので頑張って消してみた。

import List
import Data.Maybe
import Char
import Control.Monad.Reader

problem = ["SEND","MORE","MONEY"]
strForMapping = nub.concat                         -- "SENDMORY"

indicesStr :: String -> Reader [String] [Int]
indicesStr str = do pstr <- asks strForMapping 
                    return $ mapMaybe (\c ->elemIndex c pstr) str  

toMaybe::Bool->a->Maybe a
toMaybe b x = if b then Just x else Nothing

solve ::Reader [String] [[Int]]
solve = do prob <-ask 
           cand <-candidates
           bools <-sequence $ map test cand
           return $ catMaybes $ zipWith toMaybe bools cand
--           return $ filter (\x->runReader (test x) prob) cand
  where test :: [Int]->Reader [String] Bool
        test candidate = do let strToNum = (mapReader (read.map(intToDigit.(candidate!!)))).indicesStr
                            [a,b,c] <- sequence $ map (\i-> asks (!!i)>>=strToNum) [0,1,2]
                            return $ a + b == c

all_different ::[[Int]]->[[Int]]
all_different = foldr (\as bss -> [ a:bs | a <- as, bs <- bss,notElem a bs]) [[]]


initialIndex :: Reader [String] [Int]
initialIndex = do prob <- ask
                  pstr <- asks  strForMapping 
                  return $ nub $ mapMaybe (\str -> elemIndex (head str) pstr) prob

candidates :: Reader [String] [[Int]]
candidates = do pstr    <- asks strForMapping
                initIdx <- initialIndex
                return $ all_different.removeFirsts initIdx.replicate (length pstr) $ [0..9] 



removeFirsts :: [Int] -> [[Int]] -> [[Int]]
removeFirsts indices xs = zipWith (\i x->if elem i indices then tail x else x) [0..] xs

main = print $  runReader solve problem

しかし、これはこれで気持ち悪い。

もっと賢い方法があると思うんだけど……。


http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html

を読みながらmapMとfilterMを使おうと思った。

import Control.Monad

solve ::Reader [String] [[Int]]
solve = candidates>>=filterM test
  where test :: [Int]->Reader [String] Bool
        test candidate = do let strToNum = (mapReader (read.map(intToDigit.(candidate!!)))).indicesStr
                            [a,b,c] <- mapM (\i-> asks (!!i)>>=strToNum) [0,1,2]
                            return $ a + b == c

短かくなったが、何をやっているかいまいち分からない。

[0,1,2]はいわゆる添字なのでforM使った方がいい気がしてきた。

import Control.Monad

solve ::Reader [String] [[Int]]
solve = candidates>>=filterM test
  where test :: [Int]->Reader [String] Bool
        test candidate = do let strToNum = (mapReader (read.map(intToDigit.(candidate!!)))).indicesStr
                            [a,b,c] <- forM [0..2] (\i-> asks (!!i)>>=strToNum) 
                            return $ a + b == c


3*3魔方陣  3*3魔方陣 - 他人のHaskell日記 を含むブックマーク

http://d.hatena.ne.jp/TTSY/20081208#p1

拡張性ゼロの書き方で高速に求めてみた。

import Data.List
{-
a b c
d e f
g h i
-}
all_different :: [[Int]]->[[Int]]
all_different = foldr (\as bss -> [ a:bs | a <- as, bs <- bss,notElem a bs]) [[]]

magic = [xs|[a,b,d]<-all_different $ replicate 3 [1..9],
           let c = 15 - a - b,       -- -1
           let g = 15 - a - d,       -- |1
           let e = 15 - c - g,       -- /
           let h = 15 - b - e,       -- |2
           let f = 15 - d - e,       -- -2
           let i = 15 - a - e,       -- \
           c + f + i == 15,          -- |3
           g + h + i == 15,          -- -3
           let xs = [a,b,c,d,e,f,g,h,i],
           [1..9] == sort xs]

main=print magic

ghciでも一瞬。9*8*7=504通り.

束縛する式が縦3つ横3つ斜め2つで8つ、変数は9つなので、1つ決まれば後は全部決まるはずなんだけど……

a b c 
d e f 
g h i

a b c
      d  e  f
               g h i
a     d        g
  b      e       h
    c       f      i
a        e         i
    c    e     g

1 1 1 0 0 0 0 0 0      a    15
0 0 0 1 1 1 0 0 0      b    15
0 0 0 0 0 0 1 1 1      c    15
1 0 0 1 0 0 1 0 0      d    15
0 1 0 0 1 0 0 1 0  *   e  = 15
0 0 1 0 0 1 0 0 1      f    15
1 0 0 0 1 0 0 0 1      g    15 
0 0 1 0 1 0 1 0 0      h    15
                       i


1  1  1  0  0  0  0   0    0          15
0  1  0  0  1  0  0   1    0          15
0  0  1  0  0  1  0   0    1          15
0  0  0  1  1  1  0   0    0          15
0  0  0  0  1 -1  1   0   -1          0
0  0  0  0  0  1 -2/3 1/3 4/3         0 
0  0  0  0  0  0  1   1    1          15

                                       a
15    0  1  1  0  0  0  0   0    0     b     a   
15    0  0  0  0  1  0  0   1    0     c     b
15    0  0  0  0  0  1  0   0    1     d     c 
15 -  0  0  0  0  1  1  0   0    0  *  e   = d   
0     0  0  0  0  0 -1  1   0   -1     f     e
0     0  0  0  0  0  0 -2/3 1/3 4/3    g     f
15    0  0  0  0  0  0  0   1    1     h     g
                                       i
g=15-zipWith (*)             [1,1] [h,i]
f=  -zipWith (*)    [-2/3,1/3,4/3] [g,h,i]
e=  -zipWith (*)       [-1,1,0,-1] [f,g,h,i]
d=15-zipWith (*)       [1,1,0,0,0] [e,f,g,h,i]
c=15-zipWith (*)     [0,0,1,0,0,1] [d,e,f,g,h,i]
b=15-zipWith (*)   [0,0,1,0,0,1,0] [c,d,e,f,g,h,i]
a=15-zipWith (*)[1,1,0,0,0,0,0,0,] [b,c,d,e,f,g,h,i]


g=15-zipWith (*) [1,1] [h,i]
f=  -zipWith (*) [-2/3,1/3,4/3] [g,h,i]
e=  -zipWith (*) [-1,1,-1] [f,g,i]
d=15-zipWith (*) [1,1] [e,f]
c=15-zipWith (*) [1,1] [f,i]
b=15-zipWith (*) [1,1] [e,h]
a=15-zipWith (*) [1,1,] [b,c]



g=15-h-i
f=(2/3)*g-(1/3)*h-(4/3)*i
e=f-g+i
d=15-e-f
c=15-f-i
b=15-e-h
a=15-b-c




import Data.List
{-
a b c
d e f
g h i
-}
magic = [xs|i<-[1..9],
            h<-delete i [1..9],
            i /= h,
            let g =15-h-i,
            let f'=2*g-h-4*i,
            mod f' 3 == 0,
            let f= 10 + div f' 3,
            let e=f-g+i,
            let d=15-e-f,
            let c=15-f-i,
            let b=15-e-h,
            let a=15-b-c,
            let xs = [a,b,c,d,e,f,g,h,i],
            [1..9] == sort xs]

main=print magic

これで9*8。

*Main Maybe> f 3
9
*Main Maybe> f 4
5765760
*Main Maybe> f 5
32382376266240000

3*3の魔方陣は式による束縛を考えれば候補は9通り

4*4の魔方陣なら5765760通り。まあコンピュータなら計算できてもよい。

しかし5*5となると総当たりではとても無理になるな。

uhenikuegideuhenikuegide2017/04/15 00:37http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ezoleyicafxirezoleyicafxir2017/04/15 00:42http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

hecawemequhecawemequ2017/04/15 00:55http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

auqeyujuauqeyuju2017/04/15 00:55http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

jawawejihiujawawejihiu2017/04/15 01:03http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

iqizipapuiqizipapu2017/04/15 01:14http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

idaokipoidaokipo2017/04/15 01:29http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ayfbusverafiayfbusverafi2017/04/15 01:49http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ukcetibixequkcetibixeq2017/04/15 01:49http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ijahevepujasijahevepujas2017/04/15 01:54http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

oduromutausoloduromutausol2017/04/15 01:58http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ruwihepoqucruwihepoquc2017/04/15 02:07http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ihuyugexopaqiihuyugexopaqi2017/04/15 02:16http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ecahojauecahojau2017/04/15 02:17http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

aparepocamiriaparepocamiri2017/04/15 02:21http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

uyidolulokiuyidoluloki2017/04/15 02:31http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

igisacitigisacit2017/04/15 02:40http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

evojinuujuyevojinuujuy2017/04/15 02:53http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

asohiowauniasohiowauni2017/04/15 02:56http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

rowepegrowepeg2017/04/15 03:07http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

eoqunecuhieoqunecuhi2017/04/15 03:15http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

esaqocoesaqoco2017/04/15 03:20http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

yikuorafipyayikuorafipya2017/04/15 03:29http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ucohabuneucohabune2017/04/15 03:33http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

acozuvifacozuvif2017/04/15 03:41http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

unehawiteceunehawitece2017/04/15 03:46http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ungijoxigungijoxig2017/04/15 03:46http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ouwoquhaluwrouwoquhaluwr2017/04/15 03:54http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

edehanooyirededehanooyired2017/04/15 04:09http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

iqcebefigiqcebefig2017/04/15 04:13http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

asegaweasegawe2017/04/15 04:25http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

axamuvxhukaxamuvxhuk2017/04/15 04:29http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

anessuxilanessuxil2017/04/15 04:31http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ozbyebiharexeozbyebiharexe2017/04/15 04:41http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

qefvjuboziqefvjubozi2017/04/15 04:50http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

oifpufirimeqoifpufirimeq2017/04/15 05:00http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ujuidejujuidej2017/04/15 05:10http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

agawadoslimiagawadoslimi2017/04/15 14:51http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ediluiwidediluiwid2017/04/16 04:32http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ubupitwuruvuubupitwuruvu2017/04/16 15:17http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

ihiholayaueyihiholayauey2017/04/19 03:11http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

etaxrezubujocetaxrezubujoc2017/04/19 03:30http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

aloxonumiialoxonumii2017/04/20 07:30http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

uyojuqifeduyojuqifed2017/04/20 07:52http://usa-onlineprednisone.net/ - usa-onlineprednisone.net.ankor <a href="http://salbutamol-ventolin-buy.net/">salbutamol-ventolin-buy.net.ankor</a> http://online-viagracanada.net/

2008-12-15

zipWithM_  zipWithM_ - 他人のHaskell日記 を含むブックマーク

zipWithM_という関数の存在を知ったのでメモ

http://ja.doukaku.org/comment/8175/

ここにかいた物を修正。

import Monad
infini n str=cycle$replicate n""++[str]
hogefizzbuzz =map(\f->drop(length f)"hoge"++f)$zipWith(++)(infini 2"Fizz")$infini 4"Buzz"
numbering n = reverse.(':':).take 2.reverse$' ':show n
main=zipWithM_(\numbering h->putStrLn(b n++h))[1..20]hogefizzbuzz

意味もなく短かくしてみた。


i n s=cycle$replicate n""++[s]
h=map(\f->drop(length f)"hoge"++f).(zipWith(++)$i 2"Fizz")$i 4"Buzz"
b=reverse.(':':).take 2.reverse.(' ':).show
main=zipWithM_(\n h->putStrLn(b n++h))[1..20]h

無理矢理もっと削ってみた。


State State - 他人のHaskell日記 を含むブックマーク

Stateが裏で何をやってるのか分からない。置換していくと混乱する。

とりあえず例を参考にFizzBuzzを作ってみた。


getFizzbuzz :: State Int String
getFizzbuzz = do i <-get
                 put (succ i)
                 let f = if mod i 3 == 0 then "Fizz" else ""
                 let b = if mod i 5 == 0 then "Buzz" else ""
                 let fb = f++b
                 return (if length fb > 0 then fb else show i)


fizzbuzz = fst $ runState (do a <-sequence $ replicate 20 getFizzbuzz
                              return a) 1

getFizzbuzzという関数がIOっぽくなった。


instance Monad (State s) where
	return a = (\s -> (a, s))

f:: s -> (a, s) 
g:: s -> (a, s) 

	f (>>=) g  = (\state -> let (ret,nextState) = f state in (g ret) nextState)
	f (>>)  g'  =(\state -> let (ret,nextState) = f state in g nextState)       --


f:: s -> (a, s) 
g:: v -> s -> (a, s) 
g':: s -> (a, s) 

威哥王威哥王2013/10/24 10:58厚生労働省承認薬の正規ED治療薬,媚薬,ダイエット薬の販売店です!

精力剤:http://www.zzleshirts.com/
威哥王:http://www.zzleshirts.com/p250.html
早漏防止:http://www.zzleshirts.com/c14.html
滋養強壮:http://www.zzleshirts.com/c15.html
ED改善:http://www.zzleshirts.com/c12.html
勃起促進:http://www.zzleshirts.com/c16.html
蟻力神:http://www.zzleshirts.com/p128.html
巨人倍増:http://www.zzleshirts.com/p2.html
狼一号:http://www.zzleshirts.com/p100.html
九鞭粒:http://www.zzleshirts.com/p463.html
男宝:http://www.zzleshirts.com/p329.html
三体牛鞭:http://www.zzleshirts.com/p402.html
新一粒神:http://www.zzleshirts.com/p429.html
蔵八宝:http://www.zzleshirts.com/p430.html
五便宝:http://www.zzleshirts.com/p238.html
三便宝:http://www.zzleshirts.com/p288.html

媚薬:http://www.zzleshirts.com/c60.html
福源春:http://www.zzleshirts.com/p372.html
紅蜘蛛:http://www.zzleshirts.com/p35.html
D10媚薬:http://www.zzleshirts.com/p74.html
花痴:http://www.zzleshirts.com/p28.html
D5原液:http://www.zzleshirts.com/p292.html
絶對高潮:http://www.zzleshirts.com/p1.html

天天素:http://www.zzleshirts.com/p387.html
終極痩身:http://www.zzleshirts.com/p52.html
超級脂肪燃焼弾:http://www.zzleshirts.com/p283.html
御秀堂:http://www.zzleshirts.com/p120.html
韓国痩身一号:http://www.zzleshirts.com/p46.html
韓国痩身1号:http://www.zzleshirts.com/p49.html
V26:http://www.zzleshirts.com/p183.html
中絶薬:http://www.zzleshirts.com/c3.html
RU486:http://www.zzleshirts.com/p59.html

VigRx:http://www.zzleshirts.com/p198.html
ビグレックス:http://www.zzleshirts.com/p198.html
イーリーシン:http://www.zzleshirts.com/p128.html
さんべんぼう:http://www.zzleshirts.com/p288.html
リドスプレー:http://www.zzleshirts.com/p212.html
キョジンバイゾウ:http://www.zzleshirts.com/p2.html
曲美:http://www.zzleshirts.com/p366.html
きょくび:http://www.zzleshirts.com/p366.html
VVK:http://www.zzleshirts.com/p192.html
Wenickman:http://www.zzleshirts.com/p192.html
ナンパオ:http://www.zzleshirts.com/p329.html
狼1号:http://www.zzleshirts.com/p100.html
巨根カプセル:http://www.zzleshirts.com/p4.html
ベニクモ:http://www.zzleshirts.com/p35.html
ハナチ:http://www.zzleshirts.com/p28.html
SEX DROPS:http://www.zzleshirts.com/p162.html
セックスドロップ:http://www.zzleshirts.com/p162.html
小情人:http://www.zzleshirts.com/p162.html
三體牛鞭:http://www.zzleshirts.com/p402.html
男根増長素:http://www.zzleshirts.com/p410.html
v26ダイエット:http://www.zzleshirts.com/p183.html
日本秀身堂:http://www.zzleshirts.com/p368.html
法国性奴:http://www.zzleshirts.com/p439.html
西班牙蒼蝿水:http://www.zzleshirts.com/p228.html
性霸2000:http://www.zzleshirts.com/p209.html
Xing霸:http://www.zzleshirts.com/p209.html
魔根:http://www.zzleshirts.com/p403.html
花之欲:http://www.zzleshirts.com/p26.html
美人豹:http://www.zzleshirts.com/p338.html
蟻王:http://www.zzleshirts.com/p206.html
アリ王:http://www.zzleshirts.com/p206.html
男露888:http://www.zzleshirts.com/p349.html
しんいちつぶしん:http://www.zzleshirts.com/p429.html
くらはちほう:http://www.zzleshirts.com/p430.html
消渇丸:http://www.zzleshirts.com/p179.html
モチベーター:http://www.zzleshirts.com/p213.html
motivator:http://www.zzleshirts.com/p213.html
媚薬 淫インモラル:http://www.zzleshirts.com/p651.html
媚薬 インモラル:http://www.zzleshirts.com/p651.html
淫インモラル:http://www.zzleshirts.com/p651.html
インモラル:http://www.zzleshirts.com/p651.html
媚薬 効果:http://www.zzleshirts.com/c60.html
媚薬 妖姫:http://www.zzleshirts.com/c60.html
中絶 薬:http://www.zzleshirts.com/c3.html
媚薬の効果:http://www.zzleshirts.com/c60.html
よく効く媚薬:http://www.zzleshirts.com/c60.html
女性用媚薬 ランキング:http://www.zzleshirts.com/c60.html
媚薬 お酒:http://www.zzleshirts.com/c60.html
媚薬 激安:http://www.zzleshirts.com/c60.html
中絶薬 通販:http://www.zzleshirts.com/c3.html
同仁堂漢方薬:http://www.zzleshirts.com/c66.html
ラッシュ 芳香劑:http://www.zzleshirts.com/c65.html
ラッシュ媚薬:http://www.zzleshirts.com/c65.html
情愛芳香剤:http://www.zzleshirts.com/c65.html
精力剤 薬局:http://www.zzleshirts.com/c1.html
精力剤 市販:http://www.zzleshirts.com/c1.html
精力剤 効果:http://www.zzleshirts.com/c1.html
精力剤 ランキング:http://www.zzleshirts.com/c1.html
精力剤 即効性:http://www.zzleshirts.com/c1.html
女性用精力剤:http://www.zzleshirts.com/c1.html
精力剤 口コミ:http://www.zzleshirts.com/c1.html
精力剤 ドリンク:http://www.zzleshirts.com/c1.html
精力 薬局:http://www.zzleshirts.com/c1.html
精力ドリンク:http://www.zzleshirts.com/c1.html
ed治療薬:http://www.zzleshirts.com/c12.html
ed治療薬 通販:http://www.zzleshirts.com/c12.html
ed治療薬 個人輸入:http://www.zzleshirts.com/c12.html
ed治療薬 市販:http://www.zzleshirts.com/c12.html
ed治療薬 ジェネリック:http://www.zzleshirts.com/c14.html
ed治療薬 ジェネリック 通販:http://www.zzleshirts.com/c14.html
ed治療薬 種類:http://www.zzleshirts.com/c12.html
ed治療薬 比較:http://www.zzleshirts.com/c12.html
ed治療薬比較:http://www.zzleshirts.com/c12.html
ed治療薬 値段:http://www.zzleshirts.com/c12.html
ed治療薬価格:http://www.zzleshirts.com/c12.html
ed 薬 通販:http://www.zzleshirts.com/c12.html
最強のed治療薬:http://www.zzleshirts.com/c16.html
ed治療薬 ランキング:http://www.zzleshirts.com/c16.html
ed薬品:http://www.zzleshirts.com/c16.html
滋養強壮剤 :http://www.zzleshirts.com/c15.html
滋養強壮剤おすすめ:http://www.zzleshirts.com/c15.html
滋養強壮剤 効果:http://www.zzleshirts.com/p288.html
滋養強壮剤 ランキング:http://www.zzleshirts.com/c15.html
滋養強壮 ランキング:http://www.zzleshirts.com/c15.html
滋養強壮 食べ物:http://www.zzleshirts.com/c15.html
滋養強壮剤 漢方:http://www.zzleshirts.com/p130.html
滋養強壮剤 女性:http://www.zzleshirts.com/p288.html
滋養強壮剤 ドリンク:http://www.zzleshirts.com/c15.html
漢方薬:http://www.zzleshirts.com/c66.html
漢方薬 効果:http://www.zzleshirts.com/c66.html
漢方薬 ダイエット:http://www.zzleshirts.com/
漢方薬 種類:http://www.zzleshirts.com/c66.html
漢方 種類:http://www.zzleshirts.com/c66.html
漢方薬局:http://www.zzleshirts.com/c66.html
女性用媚薬 :http://www.zzleshirts.com/c60.html
女性用媚薬 液体:http://www.zzleshirts.com/p35.html
女性用媚薬 紅蜘蛛:http://www.zzleshirts.com/p35.html
女性用媚薬 強力:http://www.zzleshirts.com/c60.html
女性用媚薬 漢方:http://www.zzleshirts.com/c60.html
女性用媚薬 花痴:http://www.zzleshirts.com/p28.html
女性用媚薬銀狐:http://www.zzleshirts.com/p418.html
媚薬 銀狐:http://www.zzleshirts.com/p418.html
女性用媚薬最強:http://www.zzleshirts.com/c60.html
男性用媚薬液体:http://www.zzleshirts.com/c1.html
媚薬液体:http://www.zzleshirts.com/p35.html
媚薬 催淫:http://www.zzleshirts.com/c63.html
媚薬液体効果:http://www.zzleshirts.com/p35.html
女性用 媚薬 強力:http://www.zzleshirts.com/c60.html
催情 :http://www.zzleshirts.com/c63.html
強力媚薬催眠催淫:http://www.zzleshirts.com/c63.html
inverma原液:http://www.zzleshirts.com/p167.html
inverma原液媚薬:http://www.zzleshirts.com/p167.html
媚薬催淫:http://www.zzleshirts.com/c63.html
媚薬 催淫剤:http://www.zzleshirts.com/c63.html
催情药:http://www.zzleshirts.com/c63.html
spanische fliege d6:http://www.zzleshirts.com/p165.html
媚薬 強力:http://www.zzleshirts.com/p28.html
避妊薬:http://www.zzleshirts.com/c23.html
避妊薬 市販:http://www.zzleshirts.com/p58.html
避妊薬 薬局:http://www.zzleshirts.com/p58.html
避妊薬 ピル:http://www.zzleshirts.com/p119.html
避妊薬 錠剤:http://www.zzleshirts.com/p119.html
避妊薬 種類:http://www.zzleshirts.com/c23.html
避妊薬 薬局:http://www.zzleshirts.com/c23.html
避妊薬 72時間:http://www.zzleshirts.com/p119.html
アフターピル:http://www.zzleshirts.com/p119.html
緊急避妊薬:http://www.zzleshirts.com/p119.html
中絶薬:http://www.zzleshirts.com/p59.html
経口中絶薬ru486:http://www.zzleshirts.com/p59.html
人工中絶薬:http://www.zzleshirts.com/p58.html
妊娠中絶薬:http://www.zzleshirts.com/p59.html

2008-12-14

ポーカー役判定の改良  ポーカー役判定の改良 - 他人のHaskell日記 を含むブックマーク

http://haskell.g.hatena.ne.jp/taninsw/20081213/p1

isFlushとcardと、その他ごにょごにょかきかえた。


import List
import Maybe
import System.Environment

data Hand = Hand Bool Bool Bool [Int]

card []       = []
card (x:y:zs) = (x,rankInt y): card zs
  where rankInt char = let allRank = "_A23456789TJQK"
                       in  fromJust (elemIndex char allRank)

isRoyal xs  =  xs == [1,10,11,12,13]
isStraight xs  = (zipWith (-) (tail xs) xs) == [1,1,1,1] 
same xs = reverse $ sort $ map (\x-> length $ filter (\a-> x == a) xs) (nub xs)

isFlush (x:xs) = all (==x) xs

cardAnalysis xs = let ranks    = sort $ map snd xs
                      suits    = map fst xs
                      royal    = isRoyal ranks
                      straight = isStraight ranks
                      sameRanks  = same ranks
                      flush    = isFlush suits
                  in Hand flush royal straight sameRanks

instance Show Hand where
  show h = case h of 
    Hand True True  False _      -> "Royal flush"
    Hand True False True  _      -> "Straight flush"
    Hand _    _     _    (4:_)   -> "Four of a kind"
    Hand _    _     _    (3:2:_) -> "Full house"
    Hand True _     _     _      -> "Flush"
    Hand _    _     True  _      -> "Straight"
    Hand _    True  _     _      -> "Straight"
    Hand _    _     _    (3:_)   -> "Three of a kind"
    Hand _    _     _    (2:2:_) -> "Two Pair"
    Hand _    _     _    (2:_)   -> "One Pair"
    Hand _    _     _    _       ->  "No Pair"

main = getArgs >>= print.cardAnalysis.card.head

-- for testing
testData = ["SQSJSASKST","D9D7D6D5D8","C2D2S2H3H2","C2D3S2H3H2",
            "S9S4S8STSJ","C4H7D5S6H3","S6H6C5DQC6","S6HQC5DQC6",
            "S6H4C5DQC6","SJSQSKSAC2"]
test     =  map (cardAnalysis.card) testData

{-
*Main> test
[Royal flush,Straight flush,Four of a kind,Full house,Flush,Straight,Three of a kind,Two Pair,One Pair,No Pair]
-}

2008-12-13

ポーカーの役判定  ポーカーの役判定 - 他人のHaskell日記 を含むブックマーク

http://ja.doukaku.org/comment/8152/ に書いたものを

http://ja.doukaku.org/comment/5456/ をみながら、ちょっとだけ書き直してみた(data使ってみたかった)

import List
import Maybe
import System.Environment

data Hand = Hand Bool Bool Bool [Int]

card str=  map (\(x:y:_)-> (x,rankInt y)) $ every 2 str
allRank = "_A23456789TJQK"
rankInt char =  fromJust (elemIndex char allRank)

every n xs = unfoldr f xs 
    where f [] = Nothing
          f cs = Just (splitAt n cs)

isRoyal xs  =  xs == [1,10,11,12,13]
isStraight xs  = (zipWith (-) (tail xs) xs) == [1,1,1,1] 
same xs = reverse $ sort $ map (\x-> length $ filter (\a-> x == a) xs) (nub xs)

isFlush xs = nub xs == [head xs]

cardAnalysis xs = let ranks    = sort $ map snd xs
                      suits    = map fst xs
                      royal    = isRoyal ranks
                      straight = isStraight ranks
                      sameRanks  = same ranks
                      flush    = isFlush suits
                  in  Hand flush royal straight sameRanks

instance Show Hand where
  show h = case h of 
    Hand True True  False _      -> "Royal flush"
    Hand True False True  _      -> "Straight flush"
    Hand _    _     _    (4:_)   -> "Four of a kind"
    Hand _    _     _    (3:2:_) -> "Full house"
    Hand True _     _     _      -> "Flush"
    Hand _    _     True  _      -> "Straight"
    Hand _    True  _     _      -> "Straight"
    Hand _    _     _    (3:_)   -> "Three of a kind"
    Hand _    _     _    (2:2:_) -> "Two Pair"
    Hand _    _     _    (2:_)   -> "One Pair"
    Hand _    _     _    _       ->  "No Pair"

main = getArgs >>= print.cardAnalysis.card.head

結構綺麗に書けたと自負してるんだけど、どうだろう。

FellipeFellipe2013/03/29 21:30That's a genuinely impressive anwesr.

gafdxwlgafdxwl2013/03/31 22:512eHpxr , [url=http://qwlsvpmkiaui.com/]qwlsvpmkiaui[/url], [link=http://wnjrklofkuug.com/]wnjrklofkuug[/link], http://ueotoeteyofc.com/

dalqmwpdalqmwp2013/04/01 11:386F9oDY , [url=http://qospeeibafgf.com/]qospeeibafgf[/url], [link=http://ikjuzdcwchto.com/]ikjuzdcwchto[/link], http://owabwgwknffo.com/

2008-12-12

sequenceのうごきをみる sequenceのうごきをみる - 他人のHaskell日記 を含むブックマーク

*Main> sequence [Just 4,Just 3]
Just [4,3]
*Main> Just 4 >>= \x-> Just 3 >>= \y-> Just (x:y:[])
Just [4,3]

*Main> sequence [Just 4,Nothing]
Nothing
*Main> Just 4 >>= \x-> Nothing >>= \y-> Just (x:y:[])
Nothing

*Main> sequence [[1,2,3],[4,5,6]]
[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]
*Main> [1,2,3] >>= \x-> [4,5,6] >>= \y-> [x:y:[]] 
[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]

*Main> sequence [[1,2,3],[]]
[]
*Main> [1,2,3] >>= \x-> [] >>= \y-> [x:y:[]] 
[]

モナドとか無視して振舞だけ見る。

Maybeのリストにseqeunceを適用すると

  • Nothingがあったら Nothingがかえってくる。
  • Nothingがなかったら、[Just a,Just b..]のリストを,Just [a,b...]の形にする。

Listのリストにsequenceを適用すると、直積がかえってくる。


2*2数独Solver  2*2数独Solver - 他人のHaskell日記 を含むブックマーク

http://ja.doukaku.org/220/

を考えている間にごにょごにょしてたらできた。もちろん総当たり。


module Main (main) where

import System.Environment
import List

yoko   lines = lines
tate   lines = transpose lines
sikaku lines = let a = map (splitAt 2) lines
                   b = [take 2 a,drop 2 a]
               in concatMap (\x->[concatMap fst x,concatMap snd x]) b
  
check lines = and $ map (\f-> and $ map all_different (f lines)) [yoko,tate,sikaku]
all_different xs = nub xs == xs  


check_problem lines = and $ map (\f-> and $ map all_different_problem (f lines)) [yoko,tate,sikaku]
all_different_problem xs = nubBy (\x y-> x /= 0 && y /=0 && x==y) xs == xs


allAnswer problem tableCanditate = filter (\table -> isAnswerOf table problem) tableCandidate
isAnswerOf table problem = and $ zipWith (\a b-> b == 0|| a == b) (concat table) (concat problem) 

lineCandidate  = filter all_different $sequence $ replicate 4 [1..4]
tableCandidate = filter check $ sequence $ replicate 4 lineCandidate

makeTable [] = []
makeTable xs = take 4 xs:makeTable (drop 4 xs)

fill16 xs = let xs'    = take 16 xs
                filler = if length xs' < 16 then replicate (16 - length xs') 0 else []
            in  xs' ++ filler
problemRange xs = map (\x-> if 0 < x && x <= 4 then x else 0) xs 

main = do args <- getArgs
          let problem = makeTable $ problemRange $ fill16 $ map read args 
          if check_problem problem then putStrLn "sudoku solver" 
                                   else error"wrong problem"
          let answer = allAnswer problem tableCandidate
          putStrLn "The problem is:"
          putStrLn $ unlines $ map show $ problem
          case  (length answer) of 
           1->  do putStrLn "The Answer is:"
                   putStrLn $ unlines $ map show $ head answer
           0->  do putStrLn "There is No Answer..."
           _->  do putStrLn "There are too many answers"
                   print answer

実行結果

>sudokuSolver 4 1 2 0 2 0 4 1 0 2 3 4 0 0 0 0
sudoku solver
The problem is:
[4,1,2,0]
[2,0,4,1]
[0,2,3,4]
[0,0,0,0]

The Answer is:
[4,1,2,3]
[2,3,4,1]
[1,2,3,4]
[3,4,1,2]

同じように、とりあえず問題の候補のリストを作ってみようとやってみたら

(あらゆる問題の組み合わせのうち、解が一つになっているものを抽出して、数の配置数を調べる、ひたすた総当たりする戦略を考えていた)

Heap exhausted;
Current maximum heap size is 268435456 bytes (256 Mb);
use `+RTS -M<size>' to increase it.

と言われた。このやりかたじゃだめだ。


「全部違う数」のリスト  「全部違う数」のリスト - 他人のHaskell日記 を含むブックマーク

import List

test = do a <- [1..20]
          b <- [1..20] \\ [a]
          c <- [1..20] \\ [a,b]
          d <- [1..20] \\ [a,b,c]
          e <- [1..20] \\ [a,b,c,d]
          return [a,b,c,d,e]


test2 = filter (\xs -> nub xs == xs) $ sequence $ replicate 5 [1..20]

前者は、違う数を組みあわせていくやりかた。

後者はとりあえず直積とったあとに、同じ数を含むものを消していくやりかた。

*Main> length test
1860480

*Main> length test2
GHC's heap exhausted: current limit is 268435456 bytes;
Use the `-M<size>' option to increase the total heap size.

前者しかダメだった。

20を15にしてみたときはちゃんと実行できて同じ結果がでたけど、前者の方がはやかった。

問題は前者の方は

  • 書くのが大変
  • 変更するのが大変
  • 可変長に対応できない

ということだ。

2008-12-11

SEND+MORE=MONEY  SEND+MORE=MONEY - 他人のHaskell日記 を含むブックマーク

http://d.hatena.ne.jp/syd_syd/20061018

いまさらながらかいてみた。

import List
import Maybe

problem = ["SEND","MORE","MONEY"]

problemStr = nub $ concat $ problem
indicesStr str = map (\c -> fromJust(elemIndex c (problemStr))) str
numStr candidate str=foldl (\a b->a * 10 + b) 0 $ map (\i -> candidate !! i) (indicesStr str) 


solve = filter (\candidate->test candidate) candidates
  where test candidate =  let fn = numStr candidate 
                          in (fn (problem !! 0) + fn (problem !! 1)) == fn (problem !! 2)

prod = foldr (\as bs -> [ a:b | a <- as, b <- bs,notElem a b]) [[]]

initialIndex = nub $ map (\str -> fromJust $ elemIndex (str !! 0) problemStr ) problem

candidates = prod $ removeFirsts initialIndex $ replicate (length problemStr) [0..9]

removeFirsts indices xs = removeFirsts' 0 xs 
    where removeFirsts' n (x:xs) 
              |elem n indices = tail x:removeFirsts' (n+1) xs
              |otherwise      =      x:removeFirsts' (n+1) xs
          removeFirsts' n []  = []



結果。

*Main> solve
[[9,5,6,7,1,0,8,2]]

酷い遅さだった。なんでだろう。


追記:コマンドプロンプト上で実行すると30秒で終わった。

しかしそれでも他の人と比べると凄くおそい


mapAccumL  mapAccumL - 他人のHaskell日記 を含むブックマーク

http://www.lab2.kuis.kyoto-u.ac.jp/~hanatani/tdiary/?date=20040715

ここの図を見て

mapAccumL               :: (a -> b -> (a, c)) -> a -> [b] -> (a, [c])
mapAccumL f lastStatus []        =  (lastStatus, [])
mapAccumL f fisrtStatus (x:xs)    =  (s'',y:ys)
     where (nextStatus, y ) = f firstStatus x
           (lastStatus, ys) = mapAccumL f nextStatus xs

と書き変えてみて、ちょっとだけ理解に近づいた気がした。

fはmapというだけあって写像関数に近いけど、小人さんの介入付きなんだ。

普通のmapなら順番は関係ないけど小人さんは状態を持っているので、

その時の気分(状態)で違う動きをするから、順番は意味があるんだ。

fはリストの値を(小人の気分(状態)にあわせて)変えるという仕事と、

小人さんの気分(状態)を変えるという仕事がある。

f(小人さんの気分,リストから要素ひとつとりだしたもの)=(小人さんの次の気分、リストの値を書きかえたもの)



import Random
import List

--Passing a RandomGen as Status 
example = snd $ mapAccumL f (mkStdGen 100) [1..100]


f randomGen element = let (r,nextRandomGen) =(randomR (0,10) randomGen)
                      in  (nextRandomGen,r - 5 + element) 

小人さんが[1..100]のリストを、その時の気分(状態)によって、値を-5~+5 変えちゃうプログラム

この場合の小人さんは乱数生成器と完全にシンクロしている。

*Main> [1..100]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,
36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,
68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,
100]
(0.02 secs, 529124 bytes)

*Main> example
[-1,4,5,5,1,5,4,7,4,8,8,10,13,17,14,14,15,21,18,17,23,27,21,24,20,25,30,27,33,33,28,30,28,30,40,
35,41,36,37,36,36,46,43,40,47,49,44,50,50,50,48,48,53,52,54,55,52,55,60,63,59,60,59,63,60,66,67,
67,65,70,70,76,78,74,70,81,76,81,77,80,85,87,79,79,88,88,82,85,92,88,90,97,93,98,92,91,96,93,101,
97]
(0.02 secs, 543416 bytes)

*Main> zipWith (-) [1..100] example
[2,-2,-2,-1,4,1,3,1,5,2,3,2,0,-3,1,2,2,-3,1,3,-2,-5,2,0,5,1,-3,1,-4,-3,3,2,5,4,-5,1,-4,2,2,4,5,
-4,0,4,-2,-3,3,-2,-1,0,3,4,0,2,1,1,5,3,-1,-3,2,2,4,1,5,0,0,1,4,0,1,-4,-5,0,5,-5,1,-3,2,0,-4,-5,
4,5,-3,-2,5,3,-3,2,1,-5,0,-4,3,5,1,5,-2,3]
(0.00 secs, 532392 bytes)