我是一个Haskell noob,他正在通过精彩的"了解你为伟大的好人的哈斯克尔"而努力.这个问题与第8章"Kinds and some type-foo"一节中的段落有关.该段落如下:
"让Frank成为豆腐的一个例子很简单.我们看到豆腐需要一个ja(所以这种形式的一个例子就是Maybe Int)并返回一个taj.所以如果我们用j替换Frank,结果类型将是Frank也许吧."
这让我有点糊涂了.在我看来,最后一句应该是:
"因此,如果我们用Frank替换t,结果类型将是Frank Int Maybe."
关于我出错的地方的任何解释都将非常感激.
我最近最近遇到了"提升产品类型"一词,与未提升产品类型形成鲜明对比.
我不记得上下文,但我发现Stack Overflow还有其他问题,询问未提升产品类型的缺点(例子).
我或多或少知道什么是产品类型.它类似于(a, b)或Foo a b c大致对应于集合论中的笛卡尔积.
在这种情况下,"解除"和"解除"这两个词的含义是什么?
考虑这个ADT:
data Property f a = Property String (f a) | Zilch
deriving Show
Run Code Online (Sandbox Code Playgroud)
这是什么f?它是一个功能a吗?它是'类型函数'吗?教练说Haskell有一个图灵完整类型的语言......所以在这种情况下,类型也可以具有函数我假设?
*Main> var = Property "Colors" [1,2,3,4]
*Main> :t var
var :: Num a => Property [] a
Run Code Online (Sandbox Code Playgroud)
怎么f样[]在这里?既然[]是空列表的构造函数,那么它f总是将成为a以下示例中类型的最外面的空构造函数?
*Main> var = Property "Colors" [(1,"Red"),(2,"Blue")]
*Main> :t var
var :: Num t => Property [] (t, [Char])
*Main> var = Property "Colors" (1,"Red")
*Main> :t var
var :: Num t => Property …Run Code Online (Sandbox Code Playgroud) 请使用以下代码:
{-# LANGUAGE KindSignatures, DataKinds #-}
data Nat = O | S Nat
class NatToInt (n :: Nat) where
natToInt :: n -> Int
instance NatToInt O where
natToInt _ = 0
instance (NatToInt n) => NatToInt (S n) where
natToInt _ = 1 + natToInt (undefined :: n)
Run Code Online (Sandbox Code Playgroud)
GHC告诉我们它期望OpenKind在类型规范中natToInt而不是a Nat,因此拒绝编译.这可以通过某种铸造来解决:
data NatToOpen :: Nat -> *
Run Code Online (Sandbox Code Playgroud)
然后更换n与NatToOpen n在t时的natToInt-s.
问题1:有没有办法*在不使用类型级包装器的情况下指定除任何函数之外的其他类型?
问题2:在我看来,非类函数将很乐意使用任何类型的类型,例如:
foo :: (a :: *) -> …Run Code Online (Sandbox Code Playgroud) 看一下Learn You a Haskell的一个kind例子:
data Frank a b = Frank {frankField :: b a} deriving (Show)
LYAH讨论:
我们看到弗兰克有一种* - >(* - >*) - >*第一个*代表a而(* - >*)代表b.
当我想到一个例子时,这对我来说很有意义:Frank String Maybe = Frank {frankField :: Maybe String}.
但我对如何思考kind右手方面感到困惑
... = Frank {frankField :: b a}.
由于返回类型frankField :: b a,怎么能kind的Frank为:
* -> (* -> *) -> * -- what does the right-most * represent?
为什么右手边kind等于* …
假设我有一个函数签名的一部分:
f :: (a -> b) -> ...
kinds对于a和b?的类型是否有任何限制(例如他们的)?
a不能是一个功能,即(c -> d)可以吗?
示例 - runKleisli来自Haskell基本模块的函数
newtype Kleisli m a b = Kleisli { runKleisli :: a -> m b }
Run Code Online (Sandbox Code Playgroud)
这意味着runKleisli有1个参数类型a,必须返回函数m,它有1个参数b?