小编bla*_*ers的帖子

Ada:子类型转换或调用'Base

我有以下-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))也不起作用.

我是否错过了 - 理解类型 - 子类型转换的概念(最有可能),是否有人有解决方案/解释?甚至是更好的解决方案?

谢谢!

types operator-overloading ada

5
推荐指数
1
解决办法
137
查看次数

Haskell 多参数类(模板化类型类)

我想为标量和向量实现一个通用的高斯函数。在 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)

haskell

4
推荐指数
1
解决办法
75
查看次数

Haskell 中的值被丢弃

我不明白为什么会发生这种情况:

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)

haskell ghc

1
推荐指数
1
解决办法
143
查看次数

标签 统计

haskell ×2

ada ×1

ghc ×1

operator-overloading ×1

types ×1