1

このデータ型と関数を作成しました:

type Bit = Int

randomFloatList :: Int -> [Float]
randomFloatList seed = randoms (mkStdGen seed)

そして、を使用する関数を作成したいと思いますzipWith。関数には、seedに使用される引数としてaがrandomFloatListあり、ランダム要素が0とノ​​イズの間にある場合、ビットが変更されます。私はそれをこのようにしようとしていますが、私は困難を抱えていzipWithます:

ありがとう。

4

2 に答える 2

4

Bitのリストを取得し、ランダムなリストを使用して元のリストを変更するかどうかを決定したいと思います。(そうでない場合は、明確にしてください。)

channel :: Int -> Float -> [Bit] -> [Bit]
channel seed noise xs = zipWith (alterBit noise) (randomFloatList seed) xs

一部の角かっこは必要ないことに注意してください。関数適用では、グループ化のためだけに角かっこは必要ありません。

alterBit :: Float -> Float -> Bit -> Bit
alterBit noise random bit | random <= noise = alter bit
                          | otherwise = bit

繰り返しになりますが、これを使用しているリストへの参照をすべて削除しました。これにより、フロートとビットのリストから必要な単一zipWithの要素がこの関数に送信されます。

私は自由に定義しました

data Bit = O | I deriving Show

そして、1つの変更関数しか考えられませんでした:

alter :: Bit -> Bit
alter O = I
alter I = O

それをテストしてみましょう:

> take 6 $ randomFloatList 3
[0.10321328,0.98988104,0.46191382,0.8553592,0.7980472,0.35561606]

> map (<= 0.5) $ take 6 $ randomFloatList 3
[True,False,True,False,False,True]

> channel 3 0.5 [O,O,O,O,O,O]
[I,O,I,O,O,I]

うん、それはそれがすべきものを変えた。

于 2012-12-04T23:57:26.380 に答える
0

zipWithの署名は(a -> b -> c) -> [a] -> [b] -> [c]です。これは、2つのリストに対して2つの引数を取る関数をマッピングするのに役立つことを意味します。

あなたの場合、関数を単一のリストにマップしたいだけだと思います(関数alterBitは引数を1つしか受け取らないため)。したがってmap、ではなく、を使用する必要がありzipWithます。

また、モジュールで定数として定義するか、明示的にに渡さない限り、とは表示されないことseedにも注意してください。noisealterBitalterBit

于 2012-12-04T22:55:46.817 に答える