有人加入了#haskell
,并问了一个相当新手的作业问题。你如何排序两个相等长度的字符串元组列表?为了帮助他们 - 我的Haskell很糟糕 - 我写了这个。
sortBy (\(x:y) (x':y') -> let { a = x `compare` x'; b = y `compare` y' } in if a == EQ then b else a ) $ let f (a,b) = a++b in f ( [("a", "b"), ("e", "b"), ("x", "b"), ("x", "g")], [("b", "c"),("b", "d"), ("g", "a"), ("g", "c")] )
我认为这远非奏效。为什么这不起作用:
sortBy (\(x:y) (x':y') -> undefined) $ [("a","b"),("e","b"),("x","b"),("x","g"),("b","c"),("b","d"),("g","a"),("g","c")]
我收到此错误
<interactive>:1:67:
Couldn't match expected type `[t]'
against inferred type `([Char], [Char])'
In the expression: ("a", "b")
In the expression: [("a", "b"), ("e", "b"), ("x", "b"), ("x", "g")]
In the first argument of `f', namely
`([("a", "b"), ("e", "b"), ("x", "b"), ("x", "g")],
[("b", "c"), ("b", "d"), ("g", "a"), ("g", "c")])'
我将这些放在多行上,但我不确定在哪里打破它们以使它们起作用(Haskell的空白是愚蠢的)。
SortBy的类型为sortBy :: (a -> a -> Ordering) -> [a] -> [a]
我的列表的类型为[([Char], [Char])]
a
如何与([Char], [Char])
无法统一
sortBy :: (([Char], [Char]) -> ([Char], [Char]) -> Ordering) -> [([Char], [Char])] -> [([Char], [Char])]`
答案 0 :(得分:3)
尝试下一个
sortBy (\(x,y) (x',y') -> let { a = x `compare` x'; b = y `compare` y' } in if a == EQ then b else a ) $ let f (a,b) = a++b in f ( [("a", "b"), ("e", "b"), ("x", "b"), ("x", "g")], [("b", "c"),("b", "d"), ("g", "a"), ("g", "c")] )
对我来说这看起来像是一个错字。 (:)
是一个列表构造函数。使用(,)构造元组