如何在Haskell中学习函数的参数类型?在python中,我们有type()函数。
Ex:
in func;
if type ( a ) == Int
do <something>
但是,我不知道如何在Haskell中管理这个愿望?
答案 0 :(得分:13)
你不需要这个,因为Haskell是静态类型的,所有类型在编译时都是已知的。对于像length :: [a] -> Int
这样的多态函数(计算类型a
的元素列表的长度),没有办法找出参数的类型,因为你指定的类型是任何参数类型都适合。
答案 1 :(得分:4)
您有http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Typeable.html
然而,与动态语言相比,你需要使用这样的手段非常罕见,作为初学者你甚至不应该尝试使用它,因为你几乎肯定做错了,即使你确定你需要它。你应该接受Haskell的战斗口号“追随类型!”并使用类型系统表达你的想法,而不是试图颠覆它。
答案 2 :(得分:1)
如果您尝试进行类型定向调度,那么您可能需要一个类型类。
data Bar = ...
class Foo a where
foo :: a -> Bar
instance Foo Int where
foo = ...
func :: Foo a => a -> ...
func x ... = ... foo x ...
注意类型签名如何要求x
是Foo
类的实例。这意味着我们可以在foo
上调用x
,并且类型导向的调度将以类型安全的方式为我们完成。如果您编写的代码试图在foo
的实例上调用Foo
,那么它将是类型错误。
不允许在Haskell中执行自己的类型定向调度的原因是因为这会破坏类型系统给你的一些重要保证。我们必须告别我们的theorems for free。