이 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'
을하지만 무엇이 TypeOfSelf 및 ReturnTypeOfRectangle 될 것 ?? :
예를 들어,
lengthRef
을 만들 때이 유형을 지정할 수 있습니다 –나는 그것이 OOHaskell과 관련이 있다고 생각하는데, 당신은 자체 포인터가 마지막 인자인지 아니면 무엇을해야하는지 문서를 참고해야한다. 일반적인 객체 지향 언어에서는 일반적으로 최상위 객체 또는 일반 포인터입니다. Oohaskell에서 이에 상응하는 것을 알지 못합니다. – LeleDumbo