2014-01-18 2 views
0

나는이 문제에 대해 이전에 질문했지만 실제로 내가 무엇을 요구하는지 알지 못했다고 생각합니다. 나는 내 문제를 조금 더 잘 이해했다고 생각한다.목록의 모든 요소를 ​​목록의 모든 다른 요소와 연결/ArrowLooping

화살표가있는 FRP 라이브러리 인 netwire를 사용하고 있으며이 화살표 룹 구현에 문제가 있습니다.

나는 g 기본적으로 f을 사용하여 다른 모든 요소의 목록 주어진 목록에있는 모든 요소를 ​​묶어

f :: ArrowLoop r => a -> r [a] a 
g :: ArrowLoop r => [a] -> r() [a] 

이러한 것을 가지고 ... 음 ...이 정말 있도록 단어를 사용하여 말하기 어렵다 '길이 4의 목록을 예를 들어 줄 것이다 : ([(x, [y,z]), (y, [x,z]), (x, [x,y])][x,y,z] 같은 것을 밝혀 졌, 내가 도우미 함수 selects :: [a] -> [(a,[a])]가)

g [x0, x1, x2, x3] = proc _ -> do 
    rec 
    y0 <- f x0 -< [y1, y2, y3] 
    y1 <- f x1 -< [y0, y2, y3] 
    y2 <- f x2 -< [y0, y1, y3] 
    y3 <- f x3 -< [y0, y1, y2] 
    returnA -< [y0, y1, y2, y3] 

지금 ...이 하드 코딩 된 버전을 컴파일했습니다.이 버전은 이미 작동하며 대부분 원하는 결과를 정확하게 전달합니다. 아무런 펑키가없이 실행됩니다 <>.

"정확한"일을하는 것이 가능하다면 누구와도 알 수 있습니까? 그러나 일반적인 수의 목록 요소가 있습니까?

참고로

selects 내 구현

selects :: [a] -> [(a,[a])] 
selects = go [] 
    where 
    go xs [] = [] 
    go xs (y:ys) = (y,xs++ys) : go (y:xs) ys 

답변

2

내가 대해 그것을 실행 f을 어떤 예를하지 않았기 때문에 제대로이 테스트 있지만 수 내가 믿을 시몬 말로우에서 온다 화살표 패턴 당신이 일반화 :

g :: ArrowLoop r => [a] -> r() [a] 
g = listLoop . map f 

listLoop :: ArrowLoop r => [r [a] a] -> r() [a] 
listLoop l = const [] ^>> go l where 
    go []  = arr (const []) 
    go (r:rs) = proc bs -> do 
     rec a <- r  -< bs ++ as 
      as <- go rs -< bs ++ [a] 
     returnA -< a : as 

을 그래서 우리는 먼저 화살표의 목록을 가져 f과지도그리고 나서 우리는 화살표의 목록을 취하고 본질적으로 당신의 selects과 같은 논리를 가진 재귀 적 화살표를 정의하는 listLoop으로 명명 된 연결 자에게 그것을 공급합니다. bsr (xs에서 selects과 유사) 및 as 앞에 오는 화살표의 결과 목록은 r 다음의 화살표 결과입니다. r 각각에 대해 다른 화살표의 결과는 피드하지만 r 자체의 결과는 피드하지 않습니다 (즉, a). 그런 다음 앞의 결과 목록에 a을 추가하여 다시 실행합니다.

+0

이것은 컴파일됩니다. 미안하지만 실제로 아무 말도 할 수 없다. 왜냐하면 어떤 이유로 든 일을 끝내기 때문이다. (나는 내 ​​계산에 많은 NaN을 얻는다.) 당신이 기꺼이한다면, 나는 간단한 네이트 와이어를 얻을 수 있으며 어쩌면 거기에서 가서 왜 작동하지 않는지 알 수있을 것입니다. 그러나 나는 당신의 도움에 감사드립니다. –

+0

그래, 하드 코드 된'g '와 작동하는 몇 가지 예제 와이어를 포함시킬 수 있다면 간단하고 실행 가능한'main'을 추가로 디버깅 해줘야한다. – shang

관련 문제