2012-02-03 3 views
1

이 Haskell 코드에서 생성자 인자 (길이와 너비)는 Int, Char 등의 모든 데이터 유형이 될 수 있습니다. 길이와 너비의 데이터 유형을 명시 적으로 지정할 수있는 방법이 있습니까? getLength 함수의 반환 유형을 어떻게 지정할 수 있습니까? 이 같은 작성된 경우데이터 타입을 OO Haskell에서 지정

{-# LANGUAGE EmptyDataDecls, DeriveDataTypeable, TemplateHaskell #-} 
{-# OPTIONS_GHC -fcontext-stack=100 #-} 

module Rectangle where 

import OOHaskell 

$(label "getLength") 
$(label "getWidth") 
$(label "incr") 
$(label "lengthenBy") 
$(label "setLength") 
$(label "setWidth") 
$(label "show'") 

rectangle length width self 
= do 
    lengthRef <- newIORef length 
    widthRef <- newIORef width 
    return $ 
      getLength  .=. readIORef lengthRef 
     .*. getWidth  .=. readIORef widthRef 
     .*. setLength  .=. writeIORef lengthRef 
     .*. setWidth  .=. writeIORef widthRef 
     .*. lengthenBy .=. (\dl -> 
       do 
      length <- self # getLength 
      (self # setLength) (length + dl)) 
     .*. incr   .=. (self # lengthenBy) (1) 
     .*. show'   .=. printLn ("Length : "<< self # getLength<<" Width : "<< self # getWidth) 
     .*. emptyRecord 

주 (이것은이다) 작동합니다 :

main = do 
    c1 <- mfix $ rectangle 0 0 
    c2 <- mfix $ rectangle 0 0 
    c3 <- mfix $ rectangle 0 0 
    c1# setWidth $ 3 
    c2# setWidth $ 2 
    c3# setWidth $ 2 
    c1# incr 
    c2# incr 
    c1# incr 
    c1# show' 
    c3# show' 

그러나 폭이 문자가 될 수 없기 때문에 메인은 (그것이 바람직하지 않다 이런 식으로 작성되는 경우에도 노력하고 있습니다).

main = do 
    c1 <- mfix $ rectangle 0 'a' 
    c2 <- mfix $ rectangle 0 'b' 
    c3 <- mfix $ rectangle 0 'c' 
    c1# setWidth $ 'd' 
    c2# setWidth $ 'e' 
    c3# setWidth $ 'f' 
    c1# incr 
    c2# incr 
    c1# incr 
    c1# show' 
    c3# show' 

답변

1

이 모든 유형의 안전, 당신은 단지 유형을 제한 어딘가 타입 서명을 추가 할 필요가 있으므로, lengthRef의 내용과 일치합니다 getLength의 반환 유형 및 getLength의 종류가에서 제대로 유추해서도 안되는 가정 .

lengthRef <- newIORef (length :: Int) 
1

내가 명시 적으로 길이와 너비의 데이터 유형을 지정할 수있는 방법이 있나요?

예 :

rectangle :: TypeOfLength -> TypeOfWidth -> TypeOfSelf -> ReturnTypeOfRectangle 
rectangle length width self = ... 

내가 어떻게 기능 getLength의 반환 유형을 지정할 수 있습니다?

Oohaskell을 사용하지 않기 때문에 이것에 대해 잘 모르겠습니다. 기본적으로 함수가 예상하는 (형식) 인수와 그 반환 형식을 선언 할 수 있습니다. 구문은 위의 사각형과 같으며 반환 유형은 항상 가장 적합한 형식입니다.

참조 : http://en.wikibooks.org/wiki/Haskell/Type_basics#Type_signatures_in_code

+0

을하지만 무엇이 TypeOfSelf 및 ReturnTypeOfRectangle 될 것 ?? :

예를 들어, lengthRef을 만들 때이 유형을 지정할 수 있습니다 –

+0

나는 그것이 OOHaskell과 관련이 있다고 생각하는데, 당신은 자체 포인터가 마지막 인자인지 아니면 무엇을해야하는지 문서를 참고해야한다. 일반적인 객체 지향 언어에서는 일반적으로 최상위 객체 또는 일반 포인터입니다. Oohaskell에서 이에 상응하는 것을 알지 못합니다. – LeleDumbo

1

당신이 IORef의를 만들 때 당신은 항상 예를 ​​들어, 생성자에 유형 약어를 추가 할 수 있습니다, 같은 :

widthRef :: IORef Int <- newIORef width 

또는 함수 인수 width 자체에 해당.

관련 문제