Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 用逻辑构建数据_Haskell - Fatal编程技术网

Haskell 用逻辑构建数据

Haskell 用逻辑构建数据,haskell,Haskell,我的数据类型如下: data FooBar = FooBar { foo :: Double , bar :: Double , ter :: Double } -- hypothetical builder with some random logic mkFooBar :: Double -> Double -> FooBar mkFooBar a b | a < 5 = FooBar a b (a +

我的数据类型如下:

data FooBar =
  FooBar { foo :: Double
         , bar :: Double
         , ter :: Double
         }

-- hypothetical builder with some random logic
mkFooBar :: Double -> Double -> FooBar
mkFooBar a b
  | a < 5     = FooBar a b (a + b)
  | a > 100   = FooBar a b (a * b)
  | otherwise = FooBar (a ^ 2) (b ^ 2) ((a + b) ^2)

在Haskell中创建这样的预定义值可以吗?如果在程序中使用了N次
fbles5
,如果以这种方式编写,它将被构建N次

这会有用的。通过将值绑定到一个名称,您可以确保它只被计算(最多)一次,然后被共享,无论您使用它的频率有多高

(但有一个例外:

foo :: (Num a) => a
foo = 42

这个明显的常数是多态的,每次使用时都会重新计算(它实际上是
fromInteger(42::Integer)
)。但这不适用于你的代码,它都是单态的。)

好的,谢谢-所以我没有写任何形式的亵渎:)或“坏习惯”,对吗?@Randomize No,我看你的代码没有问题。@Randomize No,对应该只计算一次的内容使用顶级绑定是相当惯用的。要清楚,这些语句是关于GHC现在是如何工作的(即使在那时它们也不是绝对的)。Haskell报告中没有提到任何表达式的求值频率。
foo :: (Num a) => a
foo = 42