hug*_*omg 14
看起来你的问题是你试图->
用作中缀构造函数:
(为了使用a -> b -> N
语法构建列表).这是不允许的,因为Haskell中的自定义中缀构造函数必须以:
字符开头.
您的奇怪错误消息的原因是因为->
在Haskell中保留了函数类型,正如Jeff的答案所解释的那样
试试这个:
-- Create a right-associative infix constructor.
data T a = N | a :-> (T a)
infixr :->
mylist :: T Int
mylist = 10 :-> 17 :-> N
--If we hadn't made the operator right associative,
-- we would need to use explicit parenthesis here
myotherlist :: T Int
myotherlist = 10 :-> (17 :-> N)
-- Example function
isempty :: T a -> Bool
isempty N = False
isempty (_ :-> _) = True
Run Code Online (Sandbox Code Playgroud)
a -> T a
意味着a是一个返回某些东西的函数,T a
所以我认为这是错误的.尝试这样的事情.
data T a = N | R a (T a)
Run Code Online (Sandbox Code Playgroud)
N是空列表(相当于[]
)值,R是值构造函数(相当于:
)
在右侧,你需要一些方法来承载a
价值.你现在可以正确的列表.
> N -- The empty List
> R 5 N -- a list with a single element and then the end
> R 7 (R 6 (R 5 N)) -- the list 7, 6, 5
Run Code Online (Sandbox Code Playgroud)