我想在 Haskell 中为链表编写一些基本的列表操作,但我可以用这只手。我想将一个列表附加到另一个列表,但它根本不起作用,这是我的代码:
data ML a = E | L a (ML a) deriving (Show)
myList = (L 1 (L 2 (L 3 (L 4 E))))
myHead :: ML a -> a
myHead E = error "empty list"
myHead (L a _) = a
myTail :: ML a -> ML a
myTail E = error "empty list"
myTail (L _ a) = a
myAppend :: ML a -> ML a -> ML a
myAppend E a = a
myAppend (x L xs) ys = x L (xs myAppend ys)
我也有一个问题,如何显示这个列表作为一个字符串,如“1,2,3”。我有一个函数,显示它作为这样的列表 [1,2,3],但不是作为一个字符串。
toString :: ML a -> [a]
toString E = []
toString (L a l) = a:(toString l)
我认为基本问题在最后一行:
myAppend :: ML a -> ML a -> ML a
myAppend E a = a
myAppend (x L xs) ys = x L (xs myAppend ys)
构造函数是L
,在 Haskell 中,通常在其参数之前写入构造函数,例如:
myAppend :: ML a -> ML a -> ML a
myAppend E a = a
myAppend (L x xs) ys = L x (myAppend xs ys)
现在它应该工作。
关于您的第二个问题:toString ML a -> [a]
。实际上,[a]
是一个列表,而不是String
(嗯,String
是Char
s:type String = [Char]
),您猜怎么着:Haskell 中的列表实际上是一个链接列表。
如果你想写一个String
,这意味着元素应该有一个文本表示。你可以用类型约束来写,比如Show a =>
。所以现在签名是:toString :: Show a => ML a -> [String]
。
我们可以将a
的列表转换为文本表示形式,方法是map
将所有元素 ping 到其文本表示形式,然后使用逗号intercalate :: [a] -> [[a]] -> [a]
,例如:
import Data.List(intercalate)
toList :: ML a -> [a]
toList E = []
toList (L x xs) = x : toList xs
toString :: Show a => ML a -> String
toString = intercalate "," . map show . toList
或者我们可以“自己实现功能”:
toString :: Show a => ML a -> String
toString E = ""
toString (L x E) = show x
toString (L x xs) = show x++',' : toString xs
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(38条)