有没有办法在一行中定义多个类型的同义词?

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 用户会争辩说你应该使用 newtypes 来提供额外的类型安全性(或者使用现有的库类型,例如 the units library),或者简单地硬编码 Float.

顺便说一句,很少有理由使用 Float,只需使用 Double.