我将Maybes列表转换为字符串列表时遇到问题.
我的列表看起来像这样:[Nothing,Just 3,Just 9,Nothing,Nothing].
我想用点('.')取代所有Nothing,用'Int'取代所有Just Int.
到目前为止,我的解决方案无效.
[if c == Nothing then c = '.' else show (fromJust c) | c <- [Nothing, Just 3.... etc] ]
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:输入`='解析错误
我猜我不能给'c'的价值'.' 比如Java或其他语言.
有任何想法吗?
maybe从Data.Maybe中使用
import Data.Maybe
test = [Nothing, Just 3, Just 9, Nothing, Nothing]
f :: Show a => [Maybe a] -> [String]
f = map (maybe "." show)
Run Code Online (Sandbox Code Playgroud)
您的问题是您正在尝试使用列表推导来修改列表中的元素c='.'.这是Haskell,所以你永远不会修改任何东西!(好吧,除了STRef或者IORef,但是让我们把它留下来).
[if c == Nothing then "." else show (fromJust c) | c <- [Nothing, Just 3.... etc] ]
Run Code Online (Sandbox Code Playgroud)
是卓有成效的:你没有指定要替换c使用".",这已经通过使用列表理解本身的暗示.您只需要将其作为if语句的输出值.
(注意我替换'.'了".",这当然是必要的,因为输出列表的所有元素必须具有相同的类型.show (fromJust c)必然具有类型String,因此我们不能只将Chars '.'放入相同的列表中.)
但Satvik和MathematicalOrchid提到的替代方案更好.在Haskell中,您通常会尝试避免使用显式if语句,例如,如果存在标准库中的高阶函数的替代函数,例如maybe函数.如果你自己编写明确的决定,你应该更喜欢模式匹配if,比如
[ case c of
Nothing -> "."
Just number -> show number
| c <- [Nothing, Just 3.... etc] ]
Run Code Online (Sandbox Code Playgroud)
您可以执行以下操作:
[if c == Nothing then '.' else show (fromJust c) | c <- [Nothing, Just 3.... etc] ]
Run Code Online (Sandbox Code Playgroud)
你不需要写这个c =部分; 只要说什么回来.
但是,你可能想要的是maybe功能.它需要一个值来替换Nothing,并且需要一个函数来应用它Just.在你的情况下,
[maybe "." show c | c <- [...whatever...] ]
Run Code Online (Sandbox Code Playgroud)
应该这样做.或者你可以做到
map (maybe "." show) [...whatever...]
Run Code Online (Sandbox Code Playgroud)
无论你想要什么.(恕我直言,后者更清楚.)