Haskell 函数中参数的学习类型
如何学习Haskell中函数的参数类型?在python中,我们有type()函数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类型元素列表的长
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)因为你不能在这里做你想做的事情而获得了大量的表达能力。然而,可能是重复的音符,同一数据类型可能有不同的构造函数,应该以不同的方式处理。您可以使用模式匹配来处理它们。