我试图了解这是如何工作的; 在GHCi中:
foldMap (+3) (Just 5) :: Sum Int
Run Code Online (Sandbox Code Playgroud)
产生结果
Sum {getSum = 8}
Run Code Online (Sandbox Code Playgroud)
现在,foldMap的类型是
foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m
Run Code Online (Sandbox Code Playgroud)
从该类型中,foldMap使用的函数的签名与使用函数的签名(+3)不匹配:
(+3) :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)
VS
f :: Monoid m => a -> m
Run Code Online (Sandbox Code Playgroud)
如果我也尝试这样的事情:
foldMap _ (Just 5) :: Sum Int
---------------------------------------
<interactive>:113:9: error:
* Found hole: _ :: Integer -> Sum Int
* In the first argument of `foldMap', namely `_'
In the expression: …Run Code Online (Sandbox Code Playgroud) 我正在学习 Haskell 并尝试从《Haskell 编程从第一原理》一书中进行练习,并且我正在尝试编写 Pair 类型的应用程序
data Pair a = Pair a a deriving Show
Run Code Online (Sandbox Code Playgroud)
我在网上看到了一些其他示例,但我正在尝试一些不同的应用函子,我正在尝试利用这种类型的幺半群结构。这是我所拥有的
data Pair a = Pair a a deriving (Show, Eq)
instance Functor Pair where
fmap f (Pair x y) = Pair (f x) (f y)
instance Semigroup a => Semigroup (Pair a) where
(Pair x y) <> (Pair x' y') = Pair (x <> x') (y <> y')
instance Applicative Pair where
pure x = Pair x x
(Pair f g) <*> p = …Run Code Online (Sandbox Code Playgroud)