相关疑难解决方法(0)

Haskell类型系统的细微差别

我已经深入研究了haskell类型系统的细节,并试图找到类型类的优点.我已经学会了一堆,但我在以下几段代码上打了一堵墙.

使用这些类和实例定义:

class Show a => C a where
  f :: Int -> a

instance C Integer where
  f x = 1

instance C Char where
  f x = if x < 10 then 'c' else 'd'
Run Code Online (Sandbox Code Playgroud)

为什么这会传递类型检查器:

g :: C a => a -> Int -> a
g x y = f y

yes :: C a => a -> Int -> String
yes x y = show (g x y)
Run Code Online (Sandbox Code Playgroud)

但这不是吗?

g :: C a => a -> …
Run Code Online (Sandbox Code Playgroud)

haskell types system class

12
推荐指数
3
解决办法
467
查看次数

Haskell多态调用没有完整的类型知识

我有一段时间正在研究Haskell,所以我是新手.

以下代码非常容易理解:

purStrLn $ show [1]
Run Code Online (Sandbox Code Playgroud)

在这里,我们可以推断出所有类型(默认值),并且一切运行良好.但是以下代码也适用:

putStrLn $ show []
Run Code Online (Sandbox Code Playgroud)

即使我们无法推断列表类型.

如果我用ghci执行代码,我会得到以下内容:

Prelude> []
[]
Prelude> :t it
it :: [a]
Prelude> 
Run Code Online (Sandbox Code Playgroud)

所以类型似乎是多态的.但在这种情况下,将使用部分应用类型调用该节目.

相同的行为在其他类型中很常见,例如使用Data.Map.empty,因此它不是列表功能(或者至少看起来像它).

为什么以及如何运作?

polymorphism haskell types

9
推荐指数
1
解决办法
199
查看次数

标签 统计

haskell ×2

types ×2

class ×1

polymorphism ×1

system ×1