2012-11-21 2 views
7

저는 하스켈 초보자입니다. 그래서 뭔가 기본적인 것을 놓칠 수 있습니다 -이 경우 사과하지만, 다음 코드가 잘못된 이유와 왜 스택 오버플로인지 알 수 없습니다. 그것은 [1..x]의 모든 숫자로 똑같이 나눌 수있는 최소 수를 찾는 것입니다. 여기서 [1,2]를 사용합니다 (Project Euler Problem 5은 [1..20] 용입니다).아주 간단한 코드로 스택 오버플로

module Main where 

main::IO() 
main = do 
    putStrLn $ show s where s = func 1 

func :: Int -> Int 
func x 
    | foldr1 (&&) [x `mod` y == 0 | y <- [1..2]] == True = x 
    | otherwise = func x+1 

'2'를 출력해야합니다.

또한 첫 번째 가드 대신 and [mod x y == 0 | y <- [1..2]] == True = x을 사용해 보았습니다. 두 경우 모두 나는 이것을 실행하려고 할 때 스택 오버플로가 발생합니다. 나는 모든 것을 주 메뉴에 넣고 한 가지 더 많은 목록 이해력을 넣음으로써이 문제를 해결했지만,이 문제가 무엇인지 잘못 이해하고 싶습니다. 감사!

+2

'== True'를 생략 할 수 있습니다. – Franky

답변

14

문제 (또는 적어도 --- 내가 다른 사람을 위해 확인되지 않은 문제)이 일치한다 :

| otherwise = func x+1 

당신이하려는이

| otherwise = func (x+1) 

수 있지만합니다

| otherwise = (func x)+1 

함수 응용 프로그램은 모든 연산자보다 우선 순위가 높습니다.

+1

참으로 많은 고마움, 그것을 해결했습니다. 파이썬에서 하스켈까지 미끄러운 길입니다! –