3

Maybe のリストを String のリストに変換する際に問題が発生しています。

私のリストは次のようになります: [何もない、3 つだけ、9 つだけ、何もない、何もない]。

すべての Nothing をドット ('.') に置き換え、すべての Just Int を "Int" に置き換えたいと思います。

これまでの私の解決策は機能しません。

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

次のエラー メッセージが表示されます: 入力 `=' の解析エラー

c に '.' の値を与えることはできないと思います。Java や他の言語のように。

何か案は?

4

3 に答える 3

8

maybeData.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 を持っているため、 likeを同じリストにString入れることはできません。)Char'.'

しかし、Satvik と MathematicalOrchid で言及されている代替案の方が優れています。ifHaskell では、通常、関数のような標準ライブラリの高階関数を使用する代替手段がある場合は、明示的なステートメントなどを避けようとしmaybeます。明示的な決定を自分で書く場合はif、 のようによりもパターン マッチングを優先する必要があります。

[ case c of
     Nothing -> "."
     Just number -> show number
 | c <- [Nothing, Just 3.... etc] ]
于 2012-10-14T11:08:10.557 に答える
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 に答える