haskell - 正确使用类和类型

标签 haskell types

我目前正在从事一个与物理相关的项目。我想改进我已经工作的程序并赋予它更多的结构。 但目前我却在原地踏步,毫无进展。

我想构建 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/

相关文章:

python - 除以大整数时,Numpy 转换为 python float,这是一个错误吗?

python - 为什么 mypy 会忽略包含与 TypeVar 不兼容的类型的泛型变量?

javascript - JavaScript 中的 Boolean 对象和 Boolean 数据类型有什么区别?

haskell - 我可以在 Free Monad 的 Show 实例中消除 UndecidableInstances 的使用吗?

haskell - 使用 reader monad 比直接传递值有什么优势?

python - 在 Python 中区分标量、列表和字典参数的最佳方法?

scala - 在Scala中创建类型的新实例

haskell - 为什么这个循环使用 'data' 而不是 'newtype' ?

haskell - Haskell 模板 - 静态断言

haskell - IO monad 和记录语法的初学者错误