3

我在将 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或其他语言一样。

有任何想法吗?

4

3 回答 3

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...]

任你挑逗。(恕我直言,后者更清楚。)

于 2012-10-14T11:09:23.613 回答
8

maybe从 Data.Maybe使用

import Data.Maybe

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

f :: Show a => [Maybe a] -> [String]
f = map (maybe "." show)
于 2012-10-14T11:03:05.300 回答
8

您的问题是您正在尝试使用列表推导来修改列表中的元素c='.'。这是 Haskell,所以你永远不会修改任何东西!(好吧,除了STRefor IORef,但让我们把它排除在外)。

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

诀窍:您不必指定要替换c".",列表推导本身的使用已经暗示了这一点。您只需要将其作为if语句的输出值。

(注意,我用 替换'.'".",这当然是必要的,因为输出列表的所有元素都必须具有相同的类型。show (fromJust c)必须具有 type String,所以我们不能将Chars like'.'放入同一个列表中。)

但是 Satvik 和 MathematicalOrchid 提到的替代方案更好。if在 Haskell 中,如果有标准库中的高阶函数(如函数)的替代方案,您通常会尝试避免显式语句等maybe。如果你自己写明确的决定,你应该更喜欢模式匹配if,比如

[ case c of
     Nothing -> "."
     Just number -> show number
 | c <- [Nothing, Just 3.... etc] ]
于 2012-10-14T11:08:10.557 回答