了解数据类型,类型类的签名,并使数据类型成为类型类的实例

Jun*_*ung 1 haskell typeclass type-kinds

正在阅读为了一个伟大的好事学习你一个哈斯克尔!理解实例和善意都有很大的麻烦.

Q1:那类型tTofu t,与那种签名功能的行为(* -> (* -> *)) -> *?而整体的签名tofu* -> *,不是吗?因为(* -> *) -> *结果*等等(* -> (* -> *)) -> *

Q2:当我们想要创建Frank a b类型类的实例时Tofu t,数据类型Frank a b也必须具有相同的类型t.这意味着某种a*,b* -> *,以及哪种结果b a(* -> *) -> *产生*.那是对的吗?

Q3:xin tofu x代表j a因为两者都有*.Frank与同类(* -> (* -> *)) -> *应用上x.但我不知道如何表现j ax将区分xtofu xj axFrank xa j.

我对在数据类型或类中有一个函数(Ex:bin Frank a btin Tofu t)的想法有点新意,这有点令人困惑

我在这里留下链接,因为引用会使帖子看起来不必要地长.链接

class Tofu t where
  tofu :: j a -> t a j

data Frank a b = Frank {frankField :: b a} 

instance Tofu Frank where
  tofu x = Frank x 
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 5

Q1:

所以豆腐中的类型t作为一种具有种类签名的函数(* - >(* - >*)) - >*?

t是的* -> (* -> *) -> *,或者更明确的是* -> ((* -> *) -> *),没有(* -> (* -> *)) -> *.

豆腐的整体签名是* - >*,不是吗?

tofu没有类型的签名,只有类型构造函数; 它的类型是*.它的论证和结果的类型也是如此.任何功能都一样.

Q2:你从一个错误的假设开始:instance Tofu Frank使Frank类型构造函数成为一个实例Tofu,而不是Frank a b.所以它Frank必须与哪种相同t,而不是Frank a b(它有种类*).

ba将是(* - >*) - >*

不,b a是应用b一种* -> *a实物的*,所以应用程序有样*.完全好像b是一个类型的函数x -> y,并且a是一个类型的值x,b a将有类型y,而不是(x -> y) -> x:只需替换xy通过*.

Q3:

豆腐中的x代表ja

"有类型",而不是"代表".

因为两者都有*

x 没有一种,因为它不是一种类型.

弗兰克的种类(* - >(* - >*)) - >*应用于x

不,在

tofu x = Frank x
Run Code Online (Sandbox Code Playgroud)

它是应用于的Frank 数据构造函数x,而不是类型构造函数.它是一个带签名的功能b a1 -> Frank a1 b(重命名,a所以你不要把它与它混淆tofu).所以b ~ ja1 ~ a.