2012-12-04 5 views
1

내가이 데이터 유형 및 함수를 만들었습니다zipWith 하스켈

type Bit = Int 

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

을 내가 zipWith를 사용하는 함수를 만들려고합니다. 이 함수는 seed을 인수로 사용하며 randomFloatList에 사용되며 임의 요소가 0과 노이즈 사이에 있고 비트가 변경된 경우 사용됩니다. 나는 이런 식으로하려고 노력하고 있지만, 나는 어려움을 겪고있다. zipWith :

고마워.

+0

우리는 어떤 어려움에 대해 이야기하고 있습니까? 무엇이 실패하는지 판단 할 수있는 코드를 더 제공하십시오. – ljedrz

답변

4

나는 Bit의 목록을 가지고 무작위 목록을 사용하여 원본을 변경할지 여부를 결정하려고합니다. (그렇지 않으면, 분명히하시기 바랍니다.)

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

공지 사항 당신이 괄호의 일부를 필요로하지 않았다 - 당신은 그룹에 대한 기능을 응용 프로그램에 괄호가 필요하지 않습니다. 이 기능을이 수레와 비트의 목록에서 필요로하는 단일 요소를 보내드립니다 zipWith -

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

다시 말하지만, 나는 이것을 사용하고 목록에 대한 참조를 제거했습니다.

내가
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] 

그래, 그 사람을 변화 그것은해야한다.

0

zipWith의 서명은 (a -> b -> c) -> [a] -> [b] -> [c]입니다. 이는 두리스트에 걸쳐 두 개의 인수를 취하는 함수를 맵핑하는 데 유용함을의 L합니다.

귀하의 경우 함수가 단일 목록에 매핑되기를 원하기 때문에 (alterBit 함수는 하나의 인수 만 사용하기 때문에) 이 아니라 zipWith을 사용해야합니다. 당신이 당신의 모듈에 상수로 정의하거나 alterBit에 명시 적으로 전달하지 않는

참고 또한 seednoisealterBit가 표시되지 않습니다.

+0

업데이트 된 솔루션이 작동하지 않는 이유를 알 수 있습니까? 감사합니다 – user1876106

+0

나는 정확한 해결책을 얻는다. 귀하의 설명 주셔서 감사합니다, 그것은 도움이되었다. – user1876106