Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 键入族强制参数,使其具有*_Haskell_Type Families_Type Kinds - Fatal编程技术网

Haskell 键入族强制参数,使其具有*

Haskell 键入族强制参数,使其具有*,haskell,type-families,type-kinds,Haskell,Type Families,Type Kinds,这个简单的代码不能编译 import Data.Kind type family F (k :: Type) :: (t :: k) -> Type 错误消息是 • Expected a type, but ‘t’ has kind ‘k’ • In the kind ‘(t :: k) -> Type’ 从某种意义上说,这实际上定义了一个“类型族族族族”,但我真的不明白为什么会存在这种限制 type family F (k :: Type) (t :: k) :: Type

这个简单的代码不能编译

import Data.Kind
type family F (k :: Type) :: (t :: k) -> Type
错误消息是

• Expected a type, but ‘t’ has kind ‘k’
• In the kind ‘(t :: k) -> Type’
从某种意义上说,这实际上定义了一个“类型族族族族”,但我真的不明白为什么会存在这种限制

type family F (k :: Type) (t :: k) :: Type

确实有效,但它没有相同的语义,不能使用相同的名称。

不需要在结果类型中命名
t
。你可以简单地使用

type family F (k :: Type) :: k -> Type

对于一个类型族,不是在
右侧吗?所以第一个(会)说“t类有k类”,而第二个说“t类有k类”?与TypeInType是一样的。也许
类型族F(k::type)::k->type
更接近你想要的吗?@chi-Wow,当然。我不知道为什么我把它复杂化了这么多。类型族不是真正的“函数”。第二个类型族没有类型
(k::type)->(t::k)->type
。事实上,它没有当前可以用Haskell表示的类型。第一个类型族无效,因为
(>)::type->type->type
,但您已明确声明
t::k
k
(新类型变量)与
type
不统一
(t::Type)->Type
将完全有效(与接受答案中的类型等效)。