Jam*_*son 0 haskell types function
我正在学习Haskell,但我发现很难理解什么似乎是最基本的东西!首先,了解类型.例如,我真的不了解这些函数的类型,
threetimes f x = f (f (f x))
Run Code Online (Sandbox Code Playgroud)
要么
triple x = x * 3
Run Code Online (Sandbox Code Playgroud)
不会将三倍x和三倍为整数类型,因为它们采用值并对它们应用操作?
在查看最后一个函数时,
last xs = head (reverse xs)
Run Code Online (Sandbox Code Playgroud)
最后的类型是什么?
多谢你们.对不起,如果问题似乎是基本的!
Wil*_*sem 11
您可以通过查看类型的应用方式和使用的函数来构造类型.
threetimes举个例子:
threetimes f x = f (f (f x))
Run Code Online (Sandbox Code Playgroud)
这里我们首先假设f有类型a(so f :: a),并且x有类型b(so x :: b).
现在我们来看一下函数体,最内层的表达式f x,这意味着它f是一个函数,它需要一个x输入,所以它是一个函数f :: b -> c.f x因此是这种类型f x :: c.但是现在我们看一下f (f x),因为f x :: c这意味着输入类型f应该是c,但是我们已经将它设置为b,因此我们知道b并且c是相同的类型b ~ c,并且f :: b -> b,和f (f x) :: b.
然后我们来看看整个表达式f (f (f x)).这意味着类型是b,所以我们得出结论:
threetimes :: (b -> b) -> b -> b
Run Code Online (Sandbox Code Playgroud)
triple对于triple x,我们来看看:
triple x = x * 3
Run Code Online (Sandbox Code Playgroud)
操作符实际上是一种编写函数的便捷方式,我们实际写道:
triple x = (*) x 3
Run Code Online (Sandbox Code Playgroud)
如果我们看看(*)函数以及3文字,我们会看到:
(*) :: Num a => a -> a -> a
3 :: Num b => b
Run Code Online (Sandbox Code Playgroud)
因此,这意味着,我们知道x是类型a(即x :: Num a => a),以及因为我们由此然后应用Num a => a -> a到3,那么这意味着a ~ b,这样的结果类型是:
triple :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)
last我们可以再看看head和reverse:
reverse :: [a] -> [a]
head :: [b] -> b
Run Code Online (Sandbox Code Playgroud)
所以,如果我们现在分析:
last xs = head (reverse xs)
Run Code Online (Sandbox Code Playgroud)
这意味着,我们所说的reverse与xs作为参数,因此我们知道xs :: [a],那reverse xs :: [a],我们再调用head与(reverse xs)作为参数,所以现在我们知道[a] ~ [b],作为一个结果a ~ b.我们也可以得出结论head (reverse xs) :: a,这意味着:
last :: [a] -> a
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |