Haskell 函数中参数的学习类型

Haskell 函数中参数的学习类型,haskell,Haskell,如何学习Haskell中函数的参数类型?在python中,我们有type()函数 Ex: in func; if type ( a ) == Int do <something> Ex: 在func; 如果类型(a)==Int 做 但是,我不知道如何在Haskell中实现这个愿望?您不需要这个,因为Haskell是静态类型的,所有类型在编译时都是已知的。对于多态函数,如length::[a]->Int(计算a类型元素列表的长

如何学习Haskell中函数的参数类型?在python中,我们有type()函数

Ex:    
  in func; 

       if  type ( a ) == Int 
           do <something>
Ex:
在func;
如果类型(a)==Int
做

但是,我不知道如何在Haskell中实现这个愿望?

您不需要这个,因为Haskell是静态类型的,所有类型在编译时都是已知的。对于多态函数,如
length::[a]->Int
(计算
a
类型元素列表的长度),无法找到参数的类型,因为您指定了任何参数类型都适合的类型。


然而,与动态语言相比,很少有人需要使用这种方法,作为初学者,你甚至不应该尝试使用它,因为你几乎肯定是做错了,即使你确定你需要它。您应该接受Haskell的战斗口号“跟随类型!”并使用类型系统表达您的想法,而不是试图颠覆它。

如果您试图执行类型定向分派,那么您可能需要一个类型类

data Bar = ...

class Foo a where
  foo :: a -> Bar

instance Foo Int where
  foo = ...

func :: Foo a => a -> ...
func x ... = ... foo x ...
注意类型签名如何要求
x
Foo
类的实例。这意味着我们可以在
x
上调用
foo
,并以类型安全的方式为我们执行类型导向的分派。如果您编写的代码试图对不是
foo
实例的对象调用
foo
,那么它将是一个类型错误



不允许您在Haskell中执行自己的类型定向分派的原因是,这将破坏类型系统提供给您的一些重要保证。我们不得不告别我们的。

Haskell是强类型的,所以您总是知道函数的参数是什么类型的。有时,由于TypeClass的原因,这一点比较轻松,但在后一种情况下,即使您不知道参数的具体类型,您也总是知道允许对参数执行哪些操作。如果您解释了要执行的操作,我们可以在Haskell中解释如何执行。动态类型测试几乎从来都不是正确的方法。每个人都在说“你不应该需要它”,这听起来可能有点像邪教或限制,但1)你真的不需要它,2)因为你不能在这里做你想做的事情而获得了大量的表达能力。然而,可能是重复的音符,同一数据类型可能有不同的构造函数,应该以不同的方式处理。您可以使用模式匹配来处理它们。