【问题标题】:Specify Data type In OO Haskell在 OO Haskell 中指定数据类型
【发布时间】:2012-02-03 06:04:52
【问题描述】:

在这个 Haskell 代码中,构造函数参数(长度和宽度)可以是任何数据类型(如 Int、Char 等)。有没有一种方法可以明确指定长度和宽度的数据类型? 如何指定函数getLength的返回类型

{-# 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 是可以工作的,即使它是这样写的,这是不受欢迎的(因为宽度不能是一个字符)。

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'

【问题讨论】:

    标签: haskell


    【解决方案1】:

    假设这都是类型安全的,getLength 的返回类型将匹配 lengthRef 的内容,所以你只需要在某处添加一个类型签名来约束该类型,getLength 的类型应该从中可以正确推断出来。

    例如可以在创建lengthRef时指定类型:

    lengthRef <- newIORef (length :: Int)
    

    【讨论】:

      【解决方案2】:

      有没有办法明确指定长宽的数据类型?

      是的:

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

      如何指定函数getLength的返回类型?

      我从不使用 OOHaskell,所以对此我不确定。基本上,您可以声明函数期望的类型(作为参数)及其返回类型。语法就像上面的矩形,返回类型总是最右边的。

      参考:http://en.wikibooks.org/wiki/Haskell/Type_basics#Type_signatures_in_code

      【讨论】:

      • 那么 TypeOfSelf 和 ReturnTypeOfRectangle 会是什么?
      • 我猜这与 OOHaskell 有关,您应该查阅文档,自指针是否必须是最后一个参数或什么。在常见的面向对象语言中,它通常是顶级对象或普通指针。我不知道他们在 OOHaskell 中的等价物
      【解决方案3】:

      你总是可以在你的构造函数中添加类型注释,例如当你创建IORefs时,像这样:

      widthRef :: IORef Int <- newIORef width
      

      或者函数参数width本身的等价物。

      【讨论】:

        猜你喜欢
        • 2012-05-15
        • 2023-03-04
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        相关资源
        最近更新 更多