我有以下-simple-问题:delta类型用于表示度和它的子类型,角度,其中我限制范围从0.0 .. <360.0.现在,我想覆盖子类型的"+" - 运算符以拥有自己的模运算符:
package ...
type Degree is digits Degree_Digits;
end package
package ...
subtype Limited_Angle is Degree range Degree_Min .. Degree_Max;
function "+" (Left, Right : in Limited_Angle) return Limited_Angle;
end package
Run Code Online (Sandbox Code Playgroud)
并实施:
function "+" (Left, Right : in Limited_Angle) return Limited_Angle is
res : Degree;
begin
res := Units.Base.Degrees."+"(Left, Right);
...
return Limited_Angle(res);
end "+";
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这种方式,+ - 操作符被调用.我的第一个想法是拥有类似的东西
res := Degree(Left) + Degree(Right);
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我的编译器警告无限递归.即使是更严格的:
res := (Degree(Left)) + (Degree(Right));
Run Code Online (Sandbox Code Playgroud)
关于无限递归的警告.我不明白这背后的原理.T(S)不应该将S变换为T吗?它不能是一个优化问题,因为(T(S))也不起作用.
我是否错过了 - 理解类型 - 子类型转换的概念(最有可能),是否有人有解决方案/解释?甚至是更好的解决方案?
谢谢!
我想为标量和向量实现一个通用的高斯函数。在 Ada 或 C++ 中,我只是为此选择模板,但在 Haskell 中它有点令人困惑。
我首先定义一个可以应用高斯算子的类,比如组合或计算概率:
class Gaussian g where
(!*) :: g -> g -> g
prob :: g -> a -> Float -- Here, I want a to be depending on g
data Gaussian1D = Gaussian1D Float Float
data Gaussian2D = Gaussian2D (Linear.V2 Float) Linear.V2(LinearV2 Float)
Run Code Online (Sandbox Code Playgroud)
,我想有类似的东西:
instance Gaussian Gaussian1D where
prob :: Gaussian1D -> Float -> Float
instance Gaussian Gaussian2D where
prob :: Gaussian2D -> Linear.V2 Float -> Float
Run Code Online (Sandbox Code Playgroud)
但我无法以一种很好的方式实现这一点。在不深入研究模板-haskell 领域的情况下,这是否可以通过多参数类实现,例如:
class Gaussian g a …Run Code Online (Sandbox Code Playgroud) 我不明白为什么会发生这种情况:
module Main where
import Control.Monad.Reader
data Config = Config Int
getA :: (Monad m) => ReaderT Config m Int
getA = do
Config a <- ask
return a
readConfig :: Config -> IO Int
readConfig = runReaderT getA
main :: IO ()
main = do
print "Start"
let a = Config 2
b <- readConfig a -- Will be printed
print b
let c = Config 4
print <$> readConfig c -- Silence, nobody complains..
print "Done"
Run Code Online (Sandbox Code Playgroud)
结果就是:
"Start" …Run Code Online (Sandbox Code Playgroud)