何となく最近Haskellにはまっております。
Haskellって、難しいんだけど、何故か、こう、惹かれる物がある気がします(私だけ?
同じ関数型言語ではOCamlが有名ですが、どうもあれは一回やろうとしたきりで、そんなにやる気が起きない。何だろうこの差は(笑
HaskellのML入ろうと思ったのですが、定員だそうです…しょんぼり。
まあ夏休みに突入すれば、受験の関係で暫くスイッチオフにして箱にしまってしまうので、やりたいことをやっちまおうと。
Programming:WayToHaskellerとかここA Gentle Introduction to Haskell, Version 98とかを見ながら頑張ってます。
で、その成果物として、素因数分解器を作ってみました。
バックスラッシュが'?'に化けているので適宜読み替えて下さい。……どうすればいいんでしょ?
module Main where import List import Maybe import System import Numeric erat (x:xs) = x:erat [y | y <- xs, y `mod` x /= 0] primes = erat (2:[3,5..]) factorize = flip findDividors $ flip take primes $ floor $ sqrt 12 findDividors :: Integer -> [Integer] -> [Integer] findDividors n divs | n == 1 = [] | otherwise = [x] ++ (findDividors (n `div` x) divs) where f y = (==) 0 $ mod n y x = let m = find f divs in if (isJust m) then fromJust m else n factorToStr (Factor a b) = showInt a "^" ++ (showInt b "") toExp :: [Integer] -> String toExp x = let ar = map aryToFact x in foldl1 (++) (intersperse " * " (map factorToStr (arrangeFact ar))) where aryToFact a = Factor a 1 arrangeFact [] = [] arrangeFact (x:xs) = if (xs/=[]) then (addFactors x xs) : (arrangeFact $ filter (/=x) xs) else [x] where addPower = ?f1 f2 -> Factor (base f1) (power f1 + power f2) addFactors = ?a as -> foldl addPower a (filter (==a) as) data Factor = Factor Integer Integer power (Factor a b) = b base (Factor a b) = a instance Show Factor where show (Factor a b) = "(" ++ (showInt a ",") ++ (showInt b ")") instance Eq Factor where (Factor b1 p1) == (Factor b2 p2) = (b1 == b2) usage = putStrLn "usage: factorize [number]" main = do args <- getArgs case args of x:_ -> putStrLn $ toExp $ factorize $ read x _ -> usage
長っ!誰か見てたらアドバイス下さい。