有没有办法在一行中定义多个类型的同义词?
Is there a way to define multiple type synonyms in a single line?
我的代码目前是这样的:
type Speed = Float
type Height = Float
type FuelMass = Float
type Gravity = Float
有没有办法通过对声明进行分组来避免浪费这么多space,比如
type (Speed, Height, FuelMass, Gravity) = Float
没有。类型定义是它自己的声明。如果你真的想要,你可以通过用分号而不是换行符将它们分组在同一行,但这是一种非常非常不寻常的风格。
嗯,您当然可以让模板为您生成任何代码 Haskell。
module MultiDefinitions where
import Language.Haskell.TH
import Control.Monad
multipleTypeSynonyms :: [Q Name] -> Q Type -> DecsQ
multipleTypeSynonyms synGs tG = do
t <- tG
forM synGs $ \synG -> do
syn <- synG
return $ TySynD syn [] t
然后
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
import MultiDefinitions
multipleTypeSynonyms
(newName <$> ["Speed", "Height", "FuelMass", "Gravity"]) [t| Float |]
将生成您手动编写的相同定义。
用 TH 做这样的事情是个好主意吗?几乎不。事实上,也不清楚像这样的类型同义词到底是不是一件好事——许多 Haskell 用户会争辩说你应该使用 newtype
s 来提供额外的类型安全性(或者使用现有的库类型,例如 the units
library),或者简单地硬编码 Float
.
顺便说一句,很少有理由使用 Float
,只需使用 Double
.
我的代码目前是这样的:
type Speed = Float
type Height = Float
type FuelMass = Float
type Gravity = Float
有没有办法通过对声明进行分组来避免浪费这么多space,比如
type (Speed, Height, FuelMass, Gravity) = Float
没有。类型定义是它自己的声明。如果你真的想要,你可以通过用分号而不是换行符将它们分组在同一行,但这是一种非常非常不寻常的风格。
嗯,您当然可以让模板为您生成任何代码 Haskell。
module MultiDefinitions where
import Language.Haskell.TH
import Control.Monad
multipleTypeSynonyms :: [Q Name] -> Q Type -> DecsQ
multipleTypeSynonyms synGs tG = do
t <- tG
forM synGs $ \synG -> do
syn <- synG
return $ TySynD syn [] t
然后
{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
import MultiDefinitions
multipleTypeSynonyms
(newName <$> ["Speed", "Height", "FuelMass", "Gravity"]) [t| Float |]
将生成您手动编写的相同定义。
用 TH 做这样的事情是个好主意吗?几乎不。事实上,也不清楚像这样的类型同义词到底是不是一件好事——许多 Haskell 用户会争辩说你应该使用 newtype
s 来提供额外的类型安全性(或者使用现有的库类型,例如 the units
library),或者简单地硬编码 Float
.
顺便说一句,很少有理由使用 Float
,只需使用 Double
.