2016-08-14 8 views
0

私はHaskellを学習して関数型プログラミングを学んでいます。構文を実践し、非常に単純な関数を構造化するために、小さなファイルを作成しました。ファイルに定義されているすべての関数を返すHaskell関数

["removeOdd", "removeOddGuards", "double"] 

私は私が思う:

removeOdd nums = 
    if null nums 
    then [] 
    else 
     if (mod (head nums) 2) == 0 --is even? 
     then (head nums) : (removeOdd (tail nums)) 
     else removeOdd (tail nums) 

removeOddGuards [] = [] 
removeOddGuards (x : xs) 
    | mod x 2 == 0 = x : (removeOdd xs) 
    | otherwise = removeOdd xs 

double nums = case nums of 
    []  -> [] 
    (x : xs) -> (2 * x) : (double xs) 

は、私は同じように、ファイルで定義された関数の名前のすべてのリストを返す関数を定義したいと思います:それは、次のようになりましょうオブジェクト指向言語でのリフレクションを実装しますが、これが関数型プログラミングでも有効な概念であるかどうかを理解するのはあまりにも単純ではありません。

実践的な目的のために、このプラクティスファイルで作成した関数の基本インデックスを見るために、このような関数を呼び出せるようにしたいと思います。

+2

[テンプレートハスケル](http://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#template-:これは、あなたが定義したものを見ることができる機能をどのようにhaskell)はこれを行うことができますが、高度なトピックです。なぜそのような関数を定義したいのですか?おそらく実際の目標を達成するための簡単な方法があります。 –

+0

ありがとうございます。そのような作業がどれほど複雑か、多かれ少なかれ、そしてこの練習ファイルで定義した機能のリストを素早く探してみるだけです。 –

+2

あなたの目的には ':browse ModuleName'を使いますか?リフレクションはFPでは一般的に使用されません。それは本当に必要ですか? – chi

答えて

3

関数を定義して実行するのではなく、ファイル内で定義した関数を確認したいとします。上記の定義がfoo.hsであるとします。

$ ghci foo.hs 
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help 
[1 of 1] Compiling Main    (foo.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> :browse 
removeOdd :: Integral a => [a] -> [a] 
removeOddGuards :: Integral a => [a] -> [a] 
double :: Num t => [t] -> [t] 
*Main> 
+2

':browse'はモジュール名を引数として取ることができることに注意してください。 – dfeuer

関連する問題