2011-01-22 3 views
5

그래서 여러 정의 (가드)가있는 함수가 있는데 일치하는 항목에 따라 (a, b) 또는 [ (a, b)], 그러나 컴파일러가 오류를 일으키는 이유는 서로 다른 유형이기 때문입니다. 나는이 문제를 해결하기 위해 어느 하나를 사용하려했으나 아마도 그것을 올바르게 사용하지는 않았다 : P. 어떤 도움?다른 형식을 반환하는 함수를 얻는 방법

+1

런타임시 가드가 일치하는 동안 컴파일 타임에 함수의 반환 유형을 알아야하기 때문에 직접 수행 할 수 없습니다. 하지만 정말로 다른 유형을 반환 하시겠습니까? 두 경우를 구별하기 위해 결과에 패턴 매치를하려는 경우, 어느 쪽이든 괜찮습니다. 아니면 싱글 톤리스트가 첫 번째 경우에 할 것인가? 당신이 할 일에 대해 더 자세히 설명해 주시겠습니까? – b0fh

+0

http://paste.pocoo.org/show/325066/ 내 기능은 지금까지 –

+0

이며 마법을 읽는 것과 같습니다. 그게 무슨 뜻이야? – luqui

답변

9

Either 만이다 : 나는 당신이 여기를 사용하지만 방법에 무엇이 잘못되었는지 모르겠습니다

은 간단한의 사용의 예입니다 이것을하는 방법. 그러나

foo n = case stuff n of 
      Left (a,b) -> ... 
      Right pairs -> ... 

를, 당신의 문제에 대해 아무것도 알 수 없습니다 : 누군가가이 함수를 호출 할 때

stuff :: Int -> Either (Int,Int) [(Int,Int)] 
stuff 0 = Left (0, 0) 
stuff n = Right [ (x,x) | x <- [0..n] ] 

그런 다음, 그들은 패턴 일치 알아낼 수있는 두 가지 유형이 반환 : 여기에 바보 같은 예제 일반적으로 나는 당신의 기능의 의미에 대해 좀 더 생각할 것을 권한다. 그것은 무엇을합니까, 그것은 무엇을 반환합니까? 정확하고 수학적이어야합니다. 대답이 간단할수록,이 함수는 나머지 프로그램과 Haskell의 개념과 더 잘 작동 할 것입니다. 나를 위해, 그런 설명에서는 Either이 드물게 나타납니다. 두 결과를 어떻게 통합 할 수 있습니까? 함수에 맞는 것이면 Left (a,b) 대신에 싱글 톤리스트 [(a,b)]을 반환하는 것일 수도 있습니다.

하스켈은 너무 똑똑하다. 파이썬이나 jQuery에서 익숙하지 않은 함수를 사용하면 잘 작동하지 않는다. 벙어리하고 정밀하게 유지하십시오. 에서 복잡한을 얻으십시오.이 간단한 조각을 작성하십시오. 이 문제에 대해 궁금한 점이 있으면 문제에 대한 자세한 내용, 수행하려는 내용 및 해결 방법에 대해 자세히 설명하는 다른 질문을하십시오. 설교를위한 죄송합니다 :-)

+0

우리가 타입 시스템에서 원하는 속성이 * 보존 *이라는 것을 추가하자 :'stuff :: Int -> (Int, Int) '물건 7 '에 대한 호출은'[(x, x) | x [- [0..n]'형식의'[(Int, Int)]'이다. 이는 'stuff'의 선언 된 반환 유형과 다르므로 유형이 보존되지 않습니다.우리가 어떤 타입 시스템을 신뢰한다면이 불일치가 배제되어야합니다. 따라서 유형 검사기는 우리 프로그램이 잘못 입력 된 것으로 간주합니다. –

0

하스켈의 함수는 한 가지 타입 만 반환 할 수 있으므로 함수가 (a, b) [(a.b)] 형식을 반환하므로 둘 중 하나만 사용할 수 있습니다. 나에 사용자 정의 데이터 유형에 해당 - -

test a b = 
    if a == True 
    then Left (a,b) 
    else Right [(a,b)] 
+0

이제 내 기능은 다음과 같습니다. http://paste.pocoo.org/show/325090/ 여기에 오류가 있습니다. http : //paste.pocoo. org/show/325093/ –

+0

@Chris'Right lgst i'는'Right (lgst i)'이어야합니다. – dave4420

+0

좋아요. 그래서 http://paste.pocoo.org/show/325143/는 작동하지만, 후자의 두 명의 경비원은 http://paste.pocoo.org/show/325144/와 같이 보일 필요가 있습니다. http :// /paste.pocoo.org/show/325145/ –

관련 문제