kakkun61
リストとマップを配列とハッシュマップに直せば行けるのか、ロジック直さないと駄目なのかそう ここが分かってない
a ~ b
ともまた違うっぽいんですが、どう違うんでしょうか?homogeneous equality, which means equality is between types of a same kindだから,同一kindでの関係か異なるkindでの関係かでは?
X
があって,さらにそれに交換則を満たすような結合操作が入っているときに,実際に交換して結合した2つのコンテナの値(型)の型(種)は X (a+b)
と X (b+a)
みたいなものが出てきますが,たとえばこれらのequalityが扱えないことがあるみたいな話ではないですか.:~:
とheterogeniousな :~~:
がそれぞれ定義されていますね。後者がなぜ必要なのか、私も理解できてないですが一応。data Rep :: forall k. k -> Type where RepBool :: Rep Bool RepMaybe :: Rep Maybe
Rep Bool
と Rep Maybe
の(型レベルでの)等値性を比較したい場合に kind errorになってしまう、という例です。a :~: b -> a :~~: b
は成り立つのに対して a :~~: b -> a :~: b
は成り立たないので heterogenious equality のほうが弱い、といえると私は認識していたんですがこれであってますよね……?a :~~: b -> a :~: b
が成り立たないのは Coq においてで、 Haskell では成り立つみたいです。スミマセン--without-K
な状態)なので、 John Major’s equality は Axiom を使って定義されているはずです。 John Major’s equality の除去規則(とその計算規則?)を Axiom にすれば a :~~: b -> a :~: b
は証明できるはずですが、何らかの事情で別の定義を使っているのかも知れません。{-# LANGUAGE Strict #-} import System.Environment qnr :: Double -> Double -> Double -> Double qnr n r 0 = 0 qnr n r p | n < r = 0 | n == r = q | otherwise = q + (n-r)*(log(1-p)) + (foldl (+) 0 (map log [n-r+1..n])) - (foldl (+) 0 (map log [2..r])) where q = r * (log p) exp_qnr :: Double -> Double -> Double -> Double exp_qnr n r p = exp (qnr n r p) pnr :: Double -> Double -> Double -> Double pnr n r 0 = 0 pnr n r p | n < r = 0 | n == r = exp q | otherwise = (pnr (n-1) r p) + (1 - (pnr (n-1) r p))*(exp_qnr n r p) where q = r * (log p) main = do args <- getArgs (n,r,p) <- case args of n':r':p':_ -> (,,) <$> readIO n' <*> readIO r' <*> readIO p' _ -> return (6400, 64, 0.8) -- putStrLn $ "qnr " ++ show n ++ " " ++ show r ++ " " ++ show p ++ " = " ++ show (exp_qnr n r p) putStrLn $ "pnr " ++ show n ++ " " ++ show r ++ " " ++ show p ++ " = " ++ show (pnr n r p)
こういう風に 行頭の 空白も保存されるので!
type family UIP a (x :: a) (e :: x :~: x) :: e :~: Refl where UIP a x Refl = Refl
依存型を用いて長さを型やら種レベルに持つコンテナ X
があって,
(foldl (+) 0 (map log [n-r+1..n]))
foldl' (\acc num -> log num + acc) 0 [n-r+1..n]
import ctypes
から呼び出すのがてっとり早いのではないかと思います.Data.List.delete
って、最初にマッチした要素しか消してくれないのですね。マッチする全部の要素を取り除く関数ってありませんか?Data.List.filter
を使うのはどうでしょうfilter
のような気がしますが、汎用的ではない特定の要素を全消しする専用の関数を探しているということです?