これは圏です(はてな使ったら負けだとおもっていた)

きっと何者にもなれないつぎの読者につづく。

Haskell(再+)入門中。

何となく最近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

長っ!誰か見てたらアドバイス下さい。