我在将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或其他语言。
有什么想法吗?
答案 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,所以你永远不会修改任何东西! (好吧,除了STRef
或IORef
,但让我们把它留下来。)
[if c == Nothing then "." else show (fromJust c) | c <- [Nothing, Just 3.... etc] ]
可以解决问题:您不必指定要将c
替换为"."
,这已经被列表推导本身的使用暗示了。您只需将其作为if
语句的输出值。
(请注意,我将'.'
替换为"."
,这当然是必要的,因为输出列表的所有元素必须具有相同的类型。show (fromJust c)
必须具有类型{{1} },所以我们不能只将String
像Char
放在同一个列表中。)
但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...]
无论你喜欢什么。 (恕我直言,后者更清楚。)