来自Just Haskell

poo*_*ler 3 haskell

我将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或其他语言.

有任何想法吗?

Sat*_*vik 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)
Run Code Online (Sandbox Code Playgroud)


lef*_*out 8

您的问题是您正在尝试使用列表推导来修改列表中的元素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)


Mat*_*hid 8

您可以执行以下操作:

[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)

无论你想要什么.(恕我直言,后者更清楚.)