请告诉我有什么问题?
data Stack' v = Stack' [v] Int deriving (Show) ... type StackInt = Stack' Int main = print(StackInt [1,2,3] 4)
我得到的错误是
Not in scope: data constructor `Stackint'
怎么了?
Vic*_*ith 24
在我看来,你混淆了类型和构造函数的概念,这是一个常见问题,因为它们位于不同的命名空间中,并且通常具有相同的名称.在Haskell表达式中
data SomeType = SomeType Int
Run Code Online (Sandbox Code Playgroud)
比如,你实际上是在定义类型SomeType和构造函数 SomeType.类型不是正常意义上的函数,但构造函数是.如果您向ghci询问SomeType的类型,您会得到:
:t SomeType
SomeType :: Int -> SomeType
Run Code Online (Sandbox Code Playgroud)
现在,type声明只是更长类型定义的简写,在你的情况下是StackInt一个同义词Stack' Int.但是为了构造这种类型的值,你仍然需要使用构造函数Stack'(具有类型[v] -> Int -> Stack' v).所以你的代码应该是
data Stack' v = Stack' [v] Int deriving (Show)
main = print(Stack' [1,2,3] 4)
Run Code Online (Sandbox Code Playgroud)
如果您想确定该类型,Stack' Int那么您可以添加一个函数
data Stack' v = Stack' [v] Int deriving (Show)
stackInt :: [Int] -> Int -> Stack' Int
stackInt list i = Stack' list i
main = print(stackInt [1,2,3] 4)
Run Code Online (Sandbox Code Playgroud)
编辑:不是我在stackInt list i = Stack' list i这里写的透明度,但你可以更优雅地写它stackInt = Stack'.这是类型约束,可确保您在此处获得正确的类型.
如果需要,您也可以同时拥有新函数和类型同义词,即
data Stack' v = Stack' [v] Int deriving (Show)
type StackInt = Stack' Int
stackInt :: [Int] -> Int -> StackInt
stackInt list i = Stack' list i
main = print(stackInt [1,2,3] 4)
Run Code Online (Sandbox Code Playgroud)
sep*_*p2k 16
构造函数的名称Stack'不是StackInt.使用类型别名创建type不会为构造函数创建别名(这是没有意义的,因为类型可能有许多构造函数,它们的名称根本不必与类型名称相关).