来自Just Haskell

时间:2012-10-14 10:58:34

标签: haskell

我在将Maybes列表转换为字符串列表时遇到问题。

我的列表看起来像这样:[Nothing,Just 3,Just 9,Nothing,Nothing]。

我想用点('。')取代所有Nothing's,用“Int”替换所有Just Int's。

到目前为止,我的解决方案无效。

 [if c == Nothing then c = '.' else show (fromJust c) | c <- [Nothing, Just 3.... etc] ]

我收到此错误消息:输入`='

时解析错误

我猜我不能给'c'的值。比如Java或其他语言。

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

使用Data.Maybe中的maybe

import Data.Maybe

test = [Nothing, Just 3, Just 9, Nothing, Nothing]

f :: Show a => [Maybe a] -> [String]
f = map (maybe "." show)

答案 1 :(得分:8)

您的问题是,您正在尝试通过执行c='.'将列表理解用于修改列表中的元素。这是Haskell,所以你永远不会修改任何东西! (好吧,除了STRefIORef,但让我们把它留下来。)

[if c == Nothing then "." else show (fromJust c) | c <- [Nothing, Just 3.... etc] ]

可以解决问题:您不必指定要将c替换为".",这已经被列表推导本身的使用暗示了。您只需将其作为if语句的输出值。

(请注意,我将'.'替换为".",这当然是必要的,因为输出列表的所有元素必须具有相同的类型。show (fromJust c)必须具有类型{{1} },所以我们不能只将StringChar放在同一个列表中。)

但Satvik和MathematicalOrchid提到的替代方案更好。在Haskell中,通常会尝试避免使用显式'.'语句,如果存在标准库中具有高阶函数的替代函数,例如if函数。如果您自己编写明确的决策,则应该优先选择maybe上的模式匹配,例如

if

答案 2 :(得分:8)

您可以执行以下操作:

[if c == Nothing then '.' else show (fromJust c) | c <- [Nothing, Just 3.... etc] ]

您无需编写c =部分;只是说要返回什么。

但是,你可能想要的是maybe函数。它需要一个值来替换Nothing,并在Just时应用一个函数。在你的情况下,

[maybe "." show c | c <- [...whatever...] ]

应该这样做。或者你可以做到

map (maybe "." show) [...whatever...]

无论你喜欢什么。 (恕我直言,后者更清楚。)