分享
三行代码  ›  专栏  ›  技术社区  ›  Joe

记录字段的设置值与在同一记录中涉及另一字段的计算 - Set value of record field to calculation involving another field in same record

  •  0
  • Joe  · 技术社区  · 1 周前

    如何根据同一字段中的另一个字段计算派生值 记录,在这种情况下是Zoinx区?很明显,这是无法编译的,因此需要一个不同的设计。你是怎么做到的?

      module Main where
    
      data Foo = Foo
        { batz  :: Double
        , zoinx :: Double
        } deriving (Show)
    
    
      foo =
        Foo 
          { batz = 1.0
          , zoinx = batz * 2
          }
    
      main :: IO ()
      main = do
        print foo
    
    2 回复  |  直到 1 周前
        1
  •  2
  •   Koterpillar    1 周前

    一种可能性是 RecordWildCards extension 以下内容:

    {-# LANGUAGE RecordWildCards #-}
    
    foo = Foo {..}
      where
        batz = 1.0
        zoinx = batz * 2
    
        2
  •  2
  •   Robin Zigmond    1 周前

    目前还不清楚这里的总体意图。显然,您可以将此值定义为:

    foo =
      Foo 
        { batz = 1.0
        , zoinx = 2.0
        }
    

    但我相信你不必被告知,而且这可能一点也没有帮助。

    如果你想创建几个不同的 Foo 值每个字段之间都有这种关系,然后您可以简单地定义这样的函数:

    makeFoo :: Double -> Foo
    makeFoo x = Foo { batz = x, zoinx = 2 * x }
    

    然后当然 foo = makeFoo 1

    这可以在几个方面进一步推广——首先通过改变乘数:

    makeFoo2 :: Int -> Double -> Foo
    makeFoo2 n x = Foo { batz = x, zoinx = n * x }
    

    或者你可以使用任意函数:

    makeFoo3 :: (Double -> Double) -> Double -> Foo
    makeFoo3 f x = Foo { batz = x, zoinx = f x }
    

    希望这些解决方案能够满足现实生活中激发这个问题的任何情况。