繁体   English   中英

函数签名中的类型变量

[英]Type variables in function signature

如果我执行以下操作

functionS (x,y) = y
:t functionS
functionS :: (a, b) -> b

现在具有此功能:

functionC x y = if (x > y) then True else False
:t function

我希望得到:

functionC :: (Ord a, Ord b) => a -> b -> Bool

但是我得到:

functionC :: Ord a => a -> a -> Bool

GHCI似乎可以接受之前的2个结果,但是为什么给我第二个结果呢? 为什么没有定义类型变量a和b?

我认为您可能会误读类型签名。 毫无疑问,您用来指导思想的示例令人困惑。 特别是在您的元组示例中

functionS :: (a,b) -> b
functionS (x,y) = y

表示法(_,_)表示两种不同的含义。 在第一行中, (a,b)表示type ,其对的类型为第一个元素的类型为a ,第二个元素的类型a b 在第二行中, (x,y) 表示特定对 ,其中x具有类型ay具有类型b 尽管此“双关语”提供了有用的助记符,但在您初次使用它时可能会造成混淆。 我希望对的类型是常规类型的构造函数:

functionS :: Pair a b -> b
functionS (x,y) = y

因此,继续您的问题。 在签名中,您会得到

functionC :: Ord a => a -> a -> Bool

a是一种类型 Ord a表示Ord a类型a元素相对于彼此是有序的。 该函数接受两个相同类型的参数。 可排序的一些类型是Integer (数字地), String (字典地)和其他一些。 这意味着您可以知道两个Integer的哪个较小,或者两个String的哪个较小。 但是,我们不一定知道如何判断Integer是否小于String (这很好)!您是否看到 javascript必须使用哪种类型的shenanigans来支持无类型的相等性?Haskell不必解决此问题所有!)。 这就是这个签名的意思– –只有一个可排序的类型a ,并且该函数接受了同一类型的两个元素。

您可能仍然想知道为什么functionS的签名具有两个不同的类型变量。 这是因为没有约束将它们限制为相同,例如必须将它们彼此相对排序。 functionS在一对组件上都可以很好地工作,其中两个组件都是整数,就像一个组件是整数而另一个组件是字符串一样。 没关系 Haskell总是选择最有效的类型。 因此,如果不强迫它们相同,则它们将不同。

有更多的技术方法可以解释所有这些情况,但是我觉得应该有一个直观的解释。 希望对您有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM