查看Haskell文件中定义的所有函数
我通过学习Haskell学习函数式编程。为了练习语法和构造非常简单的函数,我创建了一个小文件;假设它看起来像这样:查看Haskell文件中定义的所有函数,haskell,reflection,Haskell,Reflection,我通过学习Haskell学习函数式编程。为了练习语法和构造非常简单的函数,我创建了一个小文件;假设它看起来像这样: 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) removeO
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)
我想定义一个函数,它返回文件中定义的所有函数名称的列表,如:
["removeOdd", "removeOddGuards", "double"]
我想我会用一种面向对象的语言实现反射,但到目前为止我还太天真,无法理解这在函数式编程中是否是一个有效的概念
出于实际目的,我希望能够调用这样一个函数来查看我在此实践文件中创建的函数的基本索引。假设您不想定义和执行函数,但只想查看您在文件中定义了哪些函数。假设您的上述定义在
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>
假设您不想定义和执行函数,但只想查看在文件中定义了哪些函数。假设您的上述定义在
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>
我可以做到这一点,但这是一个高级主题。为什么要定义这样一个函数?可能有一种更简单的方法来实现你的实际目标;我只是好奇这样一个任务会有多复杂,或多或少,并寻找一种快速的方法查看我在这个实践文件中定义的函数列表。使用
:browse ModuleName
是否就足够了?反射在FP中不常用。你真的需要它吗?这可能是获得模块中所有函数的漂亮HTML列表的最简单方法。还有ghci
的:bro
命令。该语言本身不提供内置的反射功能-你想要什么并不容易-因为由于Haskell独特的抽象能力,通常有更好的编写代码的方法,而在其他语言中则需要反射。谢谢大家。在ghci中使用:浏览,作为一种解决方案非常有效。我可以做到这一点,但这是一个高级主题。为什么要定义这样一个函数?可能有一种更简单的方法来实现你的实际目标;我只是好奇这样一个任务会有多复杂,或多或少,并寻找一种快速的方法查看我在这个实践文件中定义的函数列表。使用:browse ModuleName
是否就足够了?反射在FP中不常用。你真的需要它吗?这可能是获得模块中所有函数的漂亮HTML列表的最简单方法。还有ghci
的:bro
命令。该语言本身不提供内置的反射功能-你想要什么并不容易-因为由于Haskell独特的抽象能力,通常有更好的编写代码的方法,而在其他语言中则需要反射。谢谢大家。在ghci中使用:browse
作为解决方案非常有效。您可能需要注意:browse
可以将模块名称作为参数。您可能需要注意:browse
可以将模块名称作为参数。