在ghci中,当我输入
:t (-)
Run Code Online (Sandbox Code Playgroud)
找出 的类型(-),它返回
(-) :: Num a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)
但是,当我写-1haskell 时返回一个数字,这似乎暗示它(-)的类型为Num a => a -> a。怎么可能(-)看似有两种不同的类型?
假设我有两个函数f,g它们都接受常规值并返回一个Either像这样的值:
g :: a -> Either x b
f :: b -> Either x c
Run Code Online (Sandbox Code Playgroud)
我如何将两者链接在一起以获得类似的东西f . g?
我想出的最佳解决方案是创建一个名为的辅助函数applyToRight,其工作方式如下
applyToRight :: (a -> Either x b) -> Either x a -> Either x b
applyToRight f x =
case x of
Left a -> Left a
Right b -> f b
Run Code Online (Sandbox Code Playgroud)
这样我就可以做
applyToRight f (g a)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我专门谈论Either,但我认为这个问题可以推广到所有应用函子。处理这个问题的最优雅的方法是什么?
haskell composition functor function-composition applicative
我正在考虑将仅由一个函数访问的辅助函数放入一条where语句中。它看起来像这样。
f :: Int -> Int
f a = g a + 1
where
g :: Int -> Int
g a = 2 * a
Run Code Online (Sandbox Code Playgroud)
(这个例子只是为了说明这个想法。)
对我来说,这样做的好处是这些辅助函数可以访问顶级函数的所有参数,并且很清楚辅助函数的用途。
这种方法有什么问题或缺点吗?