根据函数的类型确定函数行为

use*_*110 12 haskell

Haskell的新手很抱歉,如果这是非常基本的

这个例子取自"真实世界Haskell" -

ghci> :type fst  
fst :: (a, b) -> a
Run Code Online (Sandbox Code Playgroud)

它们显示了该fst功能的类型,然后按照本段进行操作......

"结果类型fsta.我们已经提到参数多态性使得真实类型不可访问:fst没有足够的信息来构造类型的值a,也不能将其a变成a b.所以唯一可行的有效行为(省略)无限循环或崩溃)它可以返回该对的第一个元素."

我觉得我错过了段落的基本点,也许是Haskell的重要内容.为什么fst函数不能返回类型b?为什么不能将元组作为一个参数,而只是返回一个Int(或任何其他类型的NOT a)?我不明白为什么它必须返回类型a

谢谢

ehi*_*ird 24

如果它做了任何这些事情,它的类型会改变.引用的内容是,鉴于我们知道的fst是类型(a, b) -> a,我们可以对其进行推断.如果它有不同的类型,我们将无法这样做.

例如,看到了

snd :: (a, b) -> a
snd (x, y) = y
Run Code Online (Sandbox Code Playgroud)

不进行类型检查,因此我们知道类型的值(a, b) -> a不能表现得像snd.

参数化基本上是某种类型的多态函数必须通过构造遵守某些定律的事实- 即,没有那种不遵守它们的类型良好的表达式.因此,为了能够fst用它来证明事情,我们必须首先知道它fst的类型.

特别注意那里的多态性这个词:我们不能对非多态类型做同样的推论.例如,

myFst :: (Int, String) -> Int
myFst (a, b) = a
Run Code Online (Sandbox Code Playgroud)

类型检查,但也是如此

myFst :: (Int, String) -> Int
myFst (a, b) = 42
Run Code Online (Sandbox Code Playgroud)

乃至

myFst :: (Int, String) -> Int
myFst (a, b) = length b
Run Code Online (Sandbox Code Playgroud)

参数化关键在于多态函数不能"查看"它所调用的类型这一事实.因此,知道的类型a的唯一值fst是它给出的值:元组的第一个元素.


Ant*_*ony 5

重点是,一旦拥有该类型,实施选项就会受到很大限制.如果你退回了Int,那么你的类型就是(a,b) -> Int.既然a可以是任何东西,我们就无法在实施过程中凭空捏造一个undefined,所以必须返回由来电者给我们的那个.