- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在努力理解 Haskell 中的 Functor 是什么,为此我想要一个没有任何其他属性的 Functor 示例。
我想出的工作示例是
data MyFunctor a b = MyFunctor a b deriving Show
instance Functor (MyFunctor a) where
fmap g (MyFunctor a b) = MyFunctor a $ g (b)
我猜这是一个半实用的 Functor,因为可以在对右值进行操作时安全地存储左值。然后我想在操作之前将左值替换为右值。这样……
Main> fmap (+2) MyFunctor 2 5
MyFunctor 5 7
然而,更改实例声明来执行此操作会产生错误。
data MyFunctor a b = MyFunctor a b deriving Show
instance Functor (MyFunctor a) where
fmap g (MyFunctor a b) = MyFunctor b $ g (b)
我不明白,或者不知道要搜索什么来找到足够相似的问题来帮助我。
C:\Haskell\func.hs:3:28: error:
* Couldn't match type `a1' with `a'
`a1' is a rigid type variable bound by
the type signature for:
fmap :: forall a1 b. (a1 -> b) -> MyFunctor a a1 -> MyFunctor a b
at C:\Haskell\func.hs:3:3
`a' is a rigid type variable bound by
the instance declaration at C:\Haskell\func.hs:2:10
Expected type: MyFunctor a b
Actual type: MyFunctor a1 b
* In the expression: MyFunctor b $ g (b)
In an equation for `fmap':
fmap g (MyFunctor a b) = MyFunctor b $ g (b)
In the instance declaration for `Functor (MyFunctor a)'
* Relevant bindings include
b :: a1 (bound at C:\Haskell\func.hs:3:23)
a :: a (bound at C:\Haskell\func.hs:3:21)
g :: a1 -> b (bound at C:\Haskell\func.hs:3:8)
fmap :: (a1 -> b) -> MyFunctor a a1 -> MyFunctor a b
(bound at C:\Haskell\func.hs:3:3)
最佳答案
I then want to have the left value be replace with the right value before the operation.
对于 Functor 来说,这是非法的:GHC 正确地告诉你类型不成立。特别是,MyFunctor
值的左侧部分可能与右侧部分的类型不同,如 MyFunctor 5 "hello"
中所示。并且由于 fmap
必须仅对您的类型的最后一个类型参数进行操作,因此它必须单独保留第一部分。让我们看一个更具体的例子。
回想一下fmap
的类型是
fmap :: Functor f => (a -> b) -> f a -> f b
假设你有一个你想要fmap
的对象:
obj :: MyFunctor Int String
那么,f
的类型必须是什么才能调用 fmap f obj
?为了统一涉及的类型,我们必须有
f :: (String -> a)
和
fmap f obj :: MyFunctor Int a
因此您可以看到,不可能用第二个 String 字段的先前值“替换”第一个 Int 字段:那个地方唯一允许的是之前存在的 Int!
现在,您可能会想象,如果您更改 MyFunctor 定义,使两个字段具有相同的类型,就可以使类型生效:
data MyFunctor a = MyFunctor a a
-- Also illegal
instance Functor MyFunctor where
fmap f (MyFunctor a b) = MyFunctor b (f b)
但是你也不能这样做,因为 b
和 f b
可能是不同的类型,调用者可以选择 f
> 使用,因此您的 fmap
实现可能不会假设它们是相同的。
事实上,对于任何给定的数据类型,最多有一个 Functor 的合法定义:如果你找到一个合法的,你可以确定任何其他定义都是非法的:要么类型不匹配,否则它将违反两个 Functor 定律之一:
fmap id == id
fmap f . fmap g == fmap (f . g)
如何在仍然保持类型排队的情况下违反其中一条法律?通过对不属于被 fmap
覆盖的结构的一部分的结构进行操作。例如,经常有人像这样写一个(糟糕的!)仿函数:
data Counter a = Counter Int a
instance Functor Counter where
fmap f (Counter n x) = Counter (n + 1) (f x)
但这违反了两个 Functor 定律,因为它允许您计算 fmap
被调用了多少次,这应该是一个没有公开的细节。
fmap id (Counter 0 0) == Counter 1 0
(fmap tail . fmap tail) /= fmap (tail . tail)
关于haskell - 定义你自己的 Functor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44808885/
我想在不创建仿函数类的情况下使用仿函数,但即使我将匹配的字符串存储在 foundVector 中,我的 foundVector 仍显示为空。 也告诉我有没有更好的方法来使用fucntors 我正在使用
在阅读类型类时,我发现 Functor、Applicative Functor 和 Monad 之间的关系是严格递增的权力。仿函数是可以映射的类型。 Applicative Functors 可以做同
我对在 Java 中使用仿函数(函数对象)很感兴趣。通过快速谷歌搜索,我找到了这 3 个包: Java 泛型算法:http://jga.sourceforge.net/ 公共(public)仿函数:h
我是 Haskell 的新手。我做了一个类型 Maybe3。 data Maybe3 a= Just3 a| Unknown3 | Missing3 deriving (Show, Eq, Ord)
在研究了基于 MacLane、Awodey 和 Spivak 书籍的类别理论之后,我试图理解 Haskell 中的自由/操作单子(monad)。 我们可以使用 Control.Monad.Free 从
我正在努力深入了解 Monad类的层次结构。当然,其中一部分是看到很多例子,但我对这些类是如何首次发现的历史及其动机特别感兴趣。 我了解 Monad s 最初是作为 Haskell 中 IO 问题的解
我有一个多项式 data Poly a = Poly [a] 我希望能够做类似 fmap (take 3) polynomial 的事情但我不能,因为 Poly不是真正的仿函数,因为 f我在 fmap
我想知道到什么程度Functor Haskell 中的实例由仿函数定律(唯一地)确定。 由于ghc可以推导出Functor对于至少“普通”数据类型的实例,似乎它们至少在各种情况下必须是唯一的。 为方便
我想知道到什么程度Functor Haskell 中的实例由仿函数定律(唯一)确定。 自 ghc可以得出Functor至少对于“普通”数据类型的实例,它们似乎至少在各种情况下必须是唯一的。 为方便起见
有这种类型: {-# LANGUAGE GADTs #-} data Rgb a = (Num a, Show a) => Rgb a a a 我完全能够实现 Show 类型类: instance S
背景。在我的一个类中,我们一直在探索Parser monad。 Parser monad 通常定义为 newtype Parser a = Parser (String -> [(a, String)
我正在尝试使用 length streaming-bytestring Data.ByteString.Streaming.Char8 库的函数。 我看到返回值的类型为Of,但我不清楚如何检查它。我尝
我正在尝试编写一个多态的 map (Functor) 但我遇到了这种类型的错误。 给定以下类型 type Result = | Success of 'TSuccess | Error
我一直在努力理解 Haskell 中的 Functor 是什么,为此我想要一个没有任何其他属性的 Functor 示例。 我想出的工作示例是 data MyFunctor a b = MyFuncto
我正在努力将 GHC/Arr.hs 移植到弗雷格。 数组定义: data Array i e = Array{u,l::i,n::Int,elems::(JArray e)} 有函数: amap ::
我不认为这是可能的,如果它是或为什么不是这样,我很好奇: class A { } 我想将 A 的实例视为函数,例如 A a = new A(); a(); or a(3); etc... 这是为了在特
我正在使用 C++ 模板传入 Strategy 仿函数以更改函数的行为。它工作正常。我传递的仿函数是一个没有存储的无状态类,它只是以经典的仿函数方式重载 () 运算符。 template int f
我有一个类,我试图指向其成员函数,问题是我不断收到此错误 reference to non-static member function must be called根据我的理解,需要指向一个成员函数
我一直潜伏在这里,试图弄清楚 Functor 是否可以做我需要它做的事情。 我想做的是包装对类方法的调用,并以某种方式捕获函数返回的值。鉴于我的 Functor 类,我需要做些什么才能将我的评论转化为
我想用 c++ 编写一个函数,它接受一个 int 类型的变量,它的作用是定义一个仿函数的重载运算符 () 并将该仿函数作为输出参数返回。例如: template Functor myFunc(doub
我是一名优秀的程序员,十分优秀!