2011-05-02 3 views
0

특정 조건에서 종료해야하는 기능이 있습니다. 그래서 예를 들어, 우리는 다음과 같은 기능이 있다고 :하스켈에서 재귀 함수로 종료하는 법?

func :: Int -> [[Int]] -> [[Int]] 

func _ [] = [] 

func x (a:as) = func2 x a:func x as 

func2 :: Int -> [Int] -> [Int] 

func2 _ [] = [] 

func2 x (a:as) = x*a:func2 x as 

내가 FUNC 하나를 정상적으로 호출하고 싶지만 말할 수 있습니다를 우리는 [[지능] 입력에서 음의 값을 얻을 때마다 , 우리는 종결한다. 그래서 우리는 긍정적 인 가치만을 다룹니다. 어떻게 func2가 신호를 보내서 계속 진행하는 대신 전체 프로세스를 종료 할 수있게 만들 수 있습니까?

+1

'func2 x a : func x as'를 호출하기 전에'(a : as) '에 음수 값이 있는지 확인하는 것은 어떻습니까? –

+0

어떤 목록의 요소가 부정적 일 때마다 func의 전체 프로세스를 중단 하시겠습니까? 그렇다면, func이 무엇을 돌려 주길 원합니 까? 입력 목록? – Ptival

답변

0

난 당신이 무슨 뜻인지 정말 모르겠어요,하지만 난 그에게 기회를주지 : 이것은 빈리스트가 할 것 같은 방법으로 음의 값에 대한 계산을 종료

func _ [] = [] 
func x (a:as) | a < 0 = [] 
       | otherwise = func2 x a:func x as 

. 나는 이것이 당신이 원하는 바란다. 모든

+0

func는 int 목록이 아닌 Ints 목록의 목록을 처리합니다. – Ptival

+0

네,하지만 downvote에 대한 이유는 모르겠습니다. 그는 가드 (guard)를 사용하여 부정 입력에 대한 종결 기반 사례를 작성했습니다. 질문을 읽은 후에, 나는 대답의 중요한 특징이라고 생각하는 것을 말한다. 거기에서 OP가 조정될 수 있습니다. –

+0

@jon_darkstar : hammar의 편집 된 답변을 보니, 그것이 케리가 기대했던 것보다 더 많은 것이라고 생각합니다. 그러나 나는이 질문이 약간 불분명하다는 것을 인정해야한다. – Ptival

5

첫째, 기능이 더 간단하게 쓸 수

func1 x = map (func2 x) 
func2 x = map (*x) 

음의 값이 발견 될 때 이제 그만 func2을 변경하기 쉬운

등 :

func2 x = map (*x) . takeWhile (> 0) 

편집 :

그래서이 권리를 이해하면 음수 값을 만나면 전체 계산이 실패하기를 원할 것입니다. 이를 수행하는 한 가지 방법은 결과를 Maybe에 랩핑하는 것입니다. 우리는 다음 모나드 스타일이 쓸 수 있습니다 : 두 번 FUNC2의 목록을 통과 괜찮다면

func1 :: Int -> [[Int]] -> Maybe [[Int]] 
func1 x = mapM (func2 x) 

func2 :: Int -> [Int] -> Maybe [Int] 
func2 x as = do 
    guard $ all (>= 0) as 
    return $ map (*x) as 
+0

그것이 내가 처음에 이해 한 것이지만, 한 목록에 음수 값이 들어있을 때마다 func2가 적용되는 것을 멈추고 싶을 수도 있다고 생각합니다. – Ptival

+0

글쎄, 문제는 제가 통일의 개념에서 유래했습니다. 추가 할 규칙을 찾고 X-> f (x)와 같은 규칙을 발견하면 우변에 x가 있기 때문에 실패를 반환합니다. 이전에 통합 본적이 있는지 확실하지 않습니다. 바로이 문제에 대해 좀 더 구체적으로 설명하십시오. – Kerry

0

,이 작업을 수 있습니다

수입 Data.Maybe

FUNC :: Int 인 -> [[Int]] -> [[Int]]
func a xss = map from Just. takeWhile isJust. 지도 (FUNC2가) $ XSS

FUNC2 : 지능 -> [지능] -> 아마 [지능]
FUNC2 XS
    | 임의 (< 0) xs = Nothing
    | 그렇지 않으면 = 그냥. map (* a) $ xs