我一直想知道一个完整的、包罗万象的背景instance Functor (f :.: g)是什么样的。我脑海中立即浮现的想法是:
newtype (f :.: g) a = Comp (f (g a))
instance (Functor f, Functor g) => Functor (f :.: g) where
fmap f (Comp x) = Comp (fmap (fmap f) x)
Run Code Online (Sandbox Code Playgroud)
但是,两个逆变函子也会组合成协变的,如下所示:
instance (Contravariant f, Contravariant g) => Functor (f :.: g) where
fmap f (Comp x) = Comp (contramap (contramap f) x)
Run Code Online (Sandbox Code Playgroud)
这已经不是一个有希望的开始。然而,我也注意到,从技术上讲,f甚至g不必有 kind * -> *—— 唯一的要求f :.: g :: * -> * …
在GHCi中,其类型FUN显示如下:
\xce\xbb> :k FUN\nFUN :: forall (n :: Multiplicity) -> * -> * -> *\nRun Code Online (Sandbox Code Playgroud)\n起初,我以为这是一种迂回的表达方式
\nFUN :: Multiplicity -> * -> * -> *\nRun Code Online (Sandbox Code Playgroud)\n但事实证明 Template Haskell 对于这种形式有一个单独的构造函数:ForallVisT。我找不到任何关于它的文档,而且我不知道如何开始以有意义的方式进行实验。
这个语法是什么意思?forall a -> b与“正常”有什么不同forall a. a -> b?
我正在尝试使用 Pygame 的函数来播放正弦波sndarray.make_sound。但是,当我使用这个数组来播放它时:
np.sin(2 * np.pi * np.arange(44100) * 440 / 44100).astype(np.float32)
其中440是频率,44100是采样率,而是播放响亮、刺耳的噪音。这可以使用pyaudio.PyAudio(),但是我需要一些不会阻止执行的东西。方波也会发生这种情况,但它只是不播放任何内容。我正在使用channels=1formixer.pre_init和mixer.init函数。
我怎样才能解决这个问题?如果有帮助的话,我正在使用 Mac。提前致谢!
haskell ×2
composition ×1
data-kinds ×1
forall ×1
functor ×1
playback ×1
pygame ×1
python ×1
python-3.x ×1
types ×1