我目前正在从事一个与物理相关的项目。我想改进我已经工作的程序并赋予它更多的结构。 但目前我却在原地踏步,毫无进展。
我想构建 green 的函数,但我也想非常通用,这样我当然可以重用我的库。
我想要一个类来根据问题保存绿色函数,这可以是自由空间,也可以是谐振器或其他东西。而且功能还取决于仪表。在表 1 中,我得到了如下所示的绿色函数表示:
greenF_Gauge1 :: (Scalar a -> a) -> (Scalar a -> a) -> Scalar a -> Scalar a -> Scalar a
但在量规 2 中,我多了一个参数和不同的返回类型
greenF_Gauge2 :: (Scalar a -> a) -> (Scalar a -> a) -> Scalar a -> Scalar a -> Scalar a -> Scalar a -> Complex (Scalar a)
如果绿色函数只有一个函数,并且只需根据仪表类型选择正确的函数,那就太好了。在此基础上,我想根据问题的性质(可用空间等)创建正确的函数 由于我有不同数量的参数和不同的返回类型,所以我在类定义上失败了。
我尝试过:
type GreenFC a = ((Scalar a -> a) -> (Scalar a -> a) -> Scalar a -> Scalar a -> Scalar a)
type GreenFL a = ((Scalar a -> a) -> (Scalar a -> a) -> Scalar a -> Scalar a -> Scalar a -> Complex (Scalar a))
type GreenMix a = (GreenFC a, GreenFL a)
data ResultType a = Clomb (GreenFC a) | Lrenz (GreenFL a) | Mix (GreenMix a)
class (VectorSpace a) => GreenFunc g a where
greenF :: g -> ResultType a
但是,当根据我的结构构造实际函数时,我在访问返回值时遇到问题,这些返回值是隐藏在 ResultType
中的函数。我认为必须有一种更优雅的方法来做到这一点。
我想利用类型系统的强大功能,使整个程序更加抽象,这样我就可以交换仪表,而不必修改我的代码。但目前我的理解水平是我了解类型族等,但我仍然不知道如何正确应用它们。 非常感谢任何有关该方向的提示。
最佳答案
老实说,我不知道这在物理上是否有意义,但是看看你的代码,我很想做如下的事情:
{-# LANGUAGE TypeFamilies #-}
data GreenParamFC a = GreenParamFC {
gpFC_f1, gpFC_f2 :: Scalar a -> a
, gpFC_s1, gpFC_s2 :: Scalar a
}
data GreenParamFL a = GreenParamFL {
gpFL_f1, gpFL_f2 :: Scalar a -> a
, gpFL_s1, gpFL_s2, gpFL_s3 :: Scalar a
}
data GreenMixParam a = GreenMix {
gm_FC :: GreenParamFC a
, gm_FL :: GreenParamFL a
}
class GreenParams p where
type GreenResult p a :: *
greenF :: p a -> GreenResult p a
instance GreenParams GreenParamFC where
type GreenResult GreenParamFC a = Scalar a
greenF (GreenParamFC f1 f2 s1 s2) = ...
instance GreenParams GreenParamFL where
type GreenResult GreenParamFL a = Complex (Scalar a)
greenF (GreenParamFL f1 f2 s1 s2 s3) = ...
instance GreenParams GreenMixParam where
type GreenResult GreenMixParam a = (Scalar a, Complex (Scalar a))
greenF (GreenMix
(GreenParamFC f1 f2 s1 s2)
(GreenParamFL f1 f2 s1 s2 s3)
) = (..., ...)
关于haskell - 正确使用类和类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32236957/