gpt4 book ai didi

haskell - Haskell 中的仿函数 : showing the value of an item of the type of the type parameter

转载 作者:行者123 更新时间:2023-12-03 16:19:54 25 4
gpt4 key购买 nike

GHC 不知道如何显示类型 a。

data FunctorExample a = FunctorExample { val1 :: a, 
val2 :: String
} deriving (Show)

instance Functor FunctorExample where
fmap f (FunctorExample x y) = FunctorExample (f x) (y ++ " " ++ show x)
我尝试了很多事情,包括:在数据中设置类型约束(现已弃用),并使用 {-# LANGUAGE InstanceSigs #-} 为 fmap 添加约束并添加下面建议的类型签名,但没有成功(虽然我的类型签名可能有缺陷......)。
    * No instance for (Show a) arising from a use of `show'
Possible fix:
add (Show a) to the context of
the type signature for:
fmap :: forall a b.
(a -> b) -> FunctorExample a -> FunctorExample b
是否没有将 a 限制为 Show 实例的标准方法?在我的用法中,它碰巧总是一个 Int 。

最佳答案

免责声明:如果我犯了任何错误或以不同的方式处理问题,请原谅我,我自己也是 Haskell 学习者。
我想指出的第一件事是您的定义 fmap不符合两个functor laws .这些定律的存在是为了“fmap 的行为保持可预测”。
第一定律指出 fmap id functor应该与 id functor 没有区别(即 fmap id = id )。只需观察定义,我们就可以看到:

fmap id (FunctorExample x y) = FunctorExample (id x) (y ++ ...)
...不会飞,因为第二个 y 的值容易改变。
第二定律指出 fmap (f . g) = fmap f . fmap g .我将把它留给你作为练习来检查它是否符合。
我在这里建议的是使用不同的函数,这样就没有遵守仿函数定律的负担。这样,您就可以使用类型类约束。
propagate :: Show a => (a -> b) -> FunctorExample a -> FunctorExample b
propagate f (FunctorExample x y) = FunctorExample (f x) (y ++ " " ++ show x)
现在,也许您对 fmap 有一个特定的目的。 .我不完全确定。也许您打算使用 FunctorExample在其他采用仿函数的函数中。 (我猜是这个名字。)如果是这样,请考虑重新设计 fmap定义,使其符合仿函数定律。
澄清一下,约束 fmap 的类型 is not possible .

关于haskell - Haskell 中的仿函数 : showing the value of an item of the type of the type parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65120863/

25 4 0