我创造了这个数据类型和功能:zipWith哈斯克尔
type Bit = Int
randomFloatList :: Int -> [Float]
randomFloatList seed = randoms (mkStdGen seed)
而且我想创建一个使用zipWith
功能。该函数有一个seed
作为参数,用于randomFloatList
,如果随机元素介于0和噪声之间,则该位被更改。我试图这样做,但我与困难zipWith
:
谢谢。
我创造了这个数据类型和功能:zipWith哈斯克尔
type Bit = Int
randomFloatList :: Int -> [Float]
randomFloatList seed = randoms (mkStdGen seed)
而且我想创建一个使用zipWith
功能。该函数有一个seed
作为参数,用于randomFloatList
,如果随机元素介于0和噪声之间,则该位被更改。我试图这样做,但我与困难zipWith
:
谢谢。
我相信你想采取一个Bit
s列表,并使用随机列表来决定是否改变原来的。 (如果没有,请澄清。)
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
的自由,只能想到一个ALTER功能:
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]
是啊,这换的这应该。
zipWith
的签名是(a -> b -> c) -> [a] -> [b] -> [c]
。这意味着将两个参数映射到两个列表上的函数是很有用的。
我想,你的情况,你只想映射在一个单独的列表功能(因为你的函数alterBit
只需要一个参数),所以你不得不使用map
,不zipWith
。
还请注意,除非你将它们定义为您的模块中的常量或明确地传递他们alterBit
是seed
和noise
将不可见的alterBit
。
你能说出为什么我的更新解决方案无法正常工作吗?谢谢 – user1876106
我找到了正确的解决方案。谢谢你的解释,这很有帮助。 – user1876106
我们在说什么困难?提供更多的代码,以便我们确定失败的原因。 – ljedrz