challenge メソッド数の多い組み込みクラスを列挙

言語処理系に組み込みの全クラスについて、それぞれに定義されているメソッド数が多い順に上位10番目までのクラス名とメソッド数を出力するコードを書いてください。全クラス数も示してください。

なお、「組み込み」「クラス」「メソッド」などについては、必要であれば、その言語にふさわしい対象や機能に適宜読み替えてください。(たとえば、組み込み→標準添付、クラス→型・モジュール・パッケージ…、メソッド→関数・プロシージャ…といった具合に)

ああ…、ごめんなさい。大事な但し書きを忘れました。orz

可能であれば、継承したメソッド数は含まずに、そのクラスで定義(再定義も含む)されたメソッド数のみをカウントしてください。

言語処理系ごとに、普段目にするクラス群において、最大、どのくらいのメソッドを定義したクラスが存在するのか(心情的に許容されるのか)を知りたかったのですが、継承されたメソッドを含めてしまうと、階層が深くなるほどメソッド数が多くなる当たり前の傾向を見るだけになってしまうので…

おなじ理由で、メタクラスを持たない言語では、static メソッドについてもカウントから除いてください。もし数える場合でも別物としてカウントしてください(SomeClass -> 15, SomeClass static -> 5 というように)。

おそらく、わざわざ static メソッドだけ個別にカウントせずとも、省いてしまっても結果には影響しないだろうと思われます(static メソッド数が上位10番に入るほど多く定義されているクラスは存在しないと予想されるので)。

Posted feedbacks - Haskell

ghc 限定.Preludeからエクスポートされているclassは15個しかないので全部列挙 (10個に限定するなら,コード中のコメントアウトされている部分をuncommentする) 括弧内がメソッドの数

実行例: *Main> :main Floating (18) RealFloat (14) Enum (8) Ord (7) Num (7) Integral (7) RealFrac (5) Read (5) Monad (4) Show (3) Fractional (3) Eq (2) Bounded (2) Real (1) Functor (1) ... number of classes : 15

System Message: WARNING/2 (<string>, line 5); backlink

Inline emphasis start-string without end-string.
 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
import Data.List
import Data.Ord
import System.Process

data ClassInfo = CI { className :: String, numberOfMethods :: Int }

main = do { res <- readProcess "ghc" ["-e",":browse Prelude"] []
          ; let cis = classInfos [] $ lines res
          ; let n = length cis
          ; putStr $ unlines {- $ take 10 -}
          $ map showClassInfo $ sortBy (flip (comparing numberOfMethods)) cis
          ; putStr $ unlines ["...","number of classes : "++show n]
          }

showClassInfo :: ClassInfo -> String
showClassInfo (CI name n) = name ++ " (" ++ show n ++ ")"

classInfos :: [ClassInfo] -> [String] -> [ClassInfo]
classInfos a [] = a
classInfos a (l:ls)
 | head lw /= "class" = classInfos a ls
 | otherwise = classInfos (ci:a) ls''
   where 
     lw = words l
     ci = CI name (if null ls' then 1 else length ls')
     (ls',ls'') = break (not . ("  " `isPrefixOf`)) ls
     name = case break ("=>"==) lw of
       (_,[])  -> head $ tail lw
       (_,lw') -> head $ tail lw'

すみません。プレビューせずに、形式をまちがえてupしたので実行例がこわれてしまいました。orz  実行例だけupします

*Main> :main
Floating (18)
RealFloat (14)
Enum (8)
Ord (7)
Num (7)
Integral (7)
RealFrac (5)
Read (5)
Monad (4)
Show (3)
Fractional (3)
Eq (2)
Bounded (2)
Real (1)
Functor (1)
...
number of classes : 15


Index

Feed

Other

Link

Pathtraq

loading...