Jun*_*ung 1 haskell typeclass type-kinds
正在阅读为了一个伟大的好事学习你一个哈斯克尔!理解实例和善意都有很大的麻烦.
Q1:那类型t中Tofu 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 a为x将区分x的tofu x是j a与x在Frank x这a j.
我对在数据类型或类中有一个函数(Ex:bin Frank a b或tin 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)
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:只需替换x和y通过*.
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 ~ j和a1 ~ a.