Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 调用类方法。歧义类型_Haskell_Reactive Programming - Fatal编程技术网

Haskell 调用类方法。歧义类型

Haskell 调用类方法。歧义类型,haskell,reactive-programming,Haskell,Reactive Programming,标题可能不是最清晰的,但老实说,我不知道我不知道什么:( 有一个时钟类: class Clock c where rate :: c → Double data AudRate data CtrRate 和实例: instance Clock AudRate where rate _ = 44100 instance Clock CtrRate where rate _ = 4410 我的职能: burst :: Clock p => Double -> Si

标题可能不是最清晰的,但老实说,我不知道我不知道什么:(

有一个时钟类:

class Clock c where
   rate :: c → Double

data AudRate
data CtrRate
和实例:

instance Clock AudRate where
   rate _ = 44100
instance Clock CtrRate where
   rate _ = 4410
我的职能:

burst :: Clock p => Double -> SigFun p () Double
burst m = proc () -> do 
     burstEnv <- envLineSeg [1,1,0,0] [(m/(rate (undefined :: p))), (1/4410), (m+1/4410) ] -< ()
     noise <- noiseWhite 51 -< ()
     outA -< noise * burstEnv  
但我使用的库的源代码中使用了相同的表达式

outFileHelp :: forall a p. (AudioSample a, Clock p) => 
        ([Double] -> [Double]) -- ^ Post-processing function.
     -> String              -- ^ Filename to write to.
     -> Double              -- ^ Duration of the wav in seconds.
     -> Signal p () a       -- ^ Signal representing the sound.
     -> IO ()
outFileHelp f filepath dur sf = 
let sr          = rate (undefined :: p)
  numChannels = numChans (undefined :: a)
  numSamples  = truncate (dur * sr) * numChannels
  dat         = map (fromSample . (*0.999)) 
                    (f (toSamples dur sf)) :: [Int32]
                -- multiply by 0.999 to avoid wraparound at 1.0
  array       = listArray (0, numSamples-1) dat
  aud = Audio { sampleRate    = truncate sr,
                channelNumber = numChannels,
                sampleData    = array }
in exportFile filepath aud

是否可以在我的代码中使用此表达式并使GHC编译它?是否有任何扩展?

问题是,默认情况下,类型变量的作用域仅限于单个签名。即,当您在函数签名中使用
p
时,编译器根本不会将其连接到您在函数签名中使用的
未定义::p
定义。相反,它会认为“
未定义的
属于另一种类型,也被称为
p

幸运的是,GHC可以将类型变量作用于整个函数定义:

{-# LANGUAGE ScopedTypeVariables #-}

burst :: ∀ p . Clock p => Double -> SigFun p () Double
burst m = proc () -> do 
     burstEnv <- envLineSeg [1,1,0,0] [(m/(rate (undefined :: p))), (1/4410), (m+1/4410) ] -< ()
     noise <- noiseWhite 51 -< ()
     outA -< noise * burstEnv  
{-#语言范围的TypeVariables}
爆裂::∀ 时钟p=>Double->sigfunp()Double
突发m=proc()->do

burstEnv问题在于,默认情况下,类型变量的作用域仅限于单个签名。即,当您在函数签名中使用
p
时,编译器根本不会将其连接到定义中使用的
undefined::p
。相反,它会认为“
未定义的
,属于其他类型,也被称为
p

幸运的是,GHC可以将类型变量作用于整个函数定义:

{-# LANGUAGE ScopedTypeVariables #-}

burst :: ∀ p . Clock p => Double -> SigFun p () Double
burst m = proc () -> do 
     burstEnv <- envLineSeg [1,1,0,0] [(m/(rate (undefined :: p))), (1/4410), (m+1/4410) ] -< ()
     noise <- noiseWhite 51 -< ()
     outA -< noise * burstEnv  
{-#语言范围的TypeVariables}
爆裂::∀ 时钟p=>Double->sigfunp()Double
突发m=proc()->do

burstEnv顺便说一句,这种用
未定义的
传递幻象参数的方法是危险的,而且有些过时。我会用它来写新代码。这也有点尴尬,但肯定更好。顺便说一句,这种用
未定义的
传递幻象参数的方法是危险的,有些过时。我会用inst来写新代码ead。这也有点尴尬,但肯定更好。