相关疑难解决方法(0)

为什么只有Applicative需要`pure`而没有Functor?

阅读这篇关于Haskell和类别理论基础知识的Wikibook,我学习了Functors:

仿函数本质上是类别之间的转换,因此给定类别C和D,仿函数F:C - > D.

将C中的任何对象A映射到D中的F(A).

映射态射f:A - > B在C到F(f):F(A) - > F(B)在D.

......听起来很不错.后来提供了一个例子:

我们也有一个示例实例:

instance Functor Maybe where
  fmap f (Just x) = Just (f x)
  fmap _ Nothing  = Nothing
Run Code Online (Sandbox Code Playgroud)

这是关键部分:类型构造函数可能将任何类型T转换为新类型,也许T.此外,fmap仅限于Maybe类型需要函数a - > b函数可能a - >可能b.但就是这样!我们已经定义了两个部分,一部分将Hask中的对象转换为另一个类别中的对象(Maybe类型和函数在Maybe类型上定义),以及将Hask中的态射视为此类别中的态射的东西.所以也许是一个算子.

我理解定义fmap是关键的.我很困惑"类型构造函数Maybe"如何提供第一部分.我宁愿期待类似的东西pure.

如果我做对了,Maybe而不是映射CD.(因此是类别级别的态射,这可能是Functor的要求)

我想你可以像这样重新解释我的问题:是否有一个没有明显实现的Functor pure

haskell functor category-theory

11
推荐指数
1
解决办法
1303
查看次数

关于>> = Monad运算符的签名

这是Haskell中众所周知的>> =运算符的签名

>>= :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)

问题是为什么函数的类型是

(a -> m b)
Run Code Online (Sandbox Code Playgroud)

代替

(a -> b)
Run Code Online (Sandbox Code Playgroud)

我会说后者更实用,因为它允许在定义的monad中直接集成现有的"纯"函数.

相反,编写一般的"适配器"似乎并不困难

adapt :: (Monad m) => (a -> b) -> (a -> m b)
Run Code Online (Sandbox Code Playgroud)

但无论如何,我认为更可能是你已经有了(a -> b)替代(a -> m b).

注意.我通过"实际"和"可能"来解释我的意思.如果你还没有在程序中定义任何monad,那么,你拥有的函数是"纯粹的" (a -> b),你将拥有0类型的函数,(a -> m b)因为你还没有定义m.如果那时你决定定义一个monad,m那就需要a -> m b定义新的函数.

monads haskell

9
推荐指数
2
解决办法
329
查看次数

不是对立/对立/可分解/可判定的好例子?

Contravariant类型类的家庭代表在Haskell的生态标准和基本抽象:

class Contravariant f where
    contramap :: (a -> b) -> f b -> f a

class Contravariant f => Divisible f where
    conquer :: f a
    divide  :: (a -> (b, c)) -> f b -> f c -> f a

class Divisible f => Decidable f where
    lose   :: (a -> Void) -> f a
    choose :: (a -> Either b c) -> f b -> f c -> f a
Run Code Online (Sandbox Code Playgroud)

但是,要理解这些类型类的概念并不容易。我认为,如果可以看到一些反例,将有助于更好地理解这些类型。因此,本着“ 不是函子/函子/应用/单子”的榜样精神? …

haskell functor typeclass contravariant

9
推荐指数
2
解决办法
564
查看次数

为什么Haskell包含这么多等效函数

看起来有很多功能可以做同样的事情,尤其是与Monads,Functors和Applicatives有关的功能.

示例(从大多数到最不通用):

fmap == liftA == liftM
(<*>) == ap
liftA[2345] == liftM[2345]
pure == return
(*>) == (>>)
Run Code Online (Sandbox Code Playgroud)

不直接基于FAM类树的示例:

fmap == map
Run Code Online (Sandbox Code Playgroud)

(我认为List,Foldable,Traversable还有很多,但看起来大部分时间都变得更通用了,因为我只看到旧堆栈溢出/留言板问题中旧的,不太通用的类型签名)

我个人觉得这很烦人,因为这意味着如果我需要做x,而某些函数如liftM允许我做x,那么我会使我的函数不那么通用,而且我只会去通过彻底推断类型之间的差异(例如FAM,或者可能是List,Foldable,Traversable组合)来注意那种事情,这对于初学者来说并不友好,因为简单地使用这些类型并不是那么难,关于他们的属性和法律的推理需要更多的心理努力.

我猜这些等价物很多都来自于申请Monad提案.如果这就是他们的原因(并且由于可用于混淆的通用功能较少而缺少其他原因),他们是否会被弃用/删除?由于破坏现有代码,我可以理解等待很长时间才能删除它们,但肯定会弃用是个好主意吗?

haskell

7
推荐指数
1
解决办法
255
查看次数

如何将Monad实例定义为具有多个值的类型?

多个值我的意思是这样的:

data Foo a = Bar a | Baz a a
Run Code Online (Sandbox Code Playgroud)

我想不出一个明确的方式来定义>>=Baz:

instance Monad Foo where
    Bar x   >>= f = f x -- Great, that works perfectly!
    Baz x y >>= f = ??? -- What the heck do I even put here?
Run Code Online (Sandbox Code Playgroud)

haskell

7
推荐指数
1
解决办法
499
查看次数

为什么`((,)r)`一个非适用的Functor?

来自不适用的仿函数:

一个类型构造函数,它是一个Functor但不是Applicative.一个简单的例子是一对:

instance Functor ((,) r) where
    fmap f (x,y) = (x, f y)
Run Code Online (Sandbox Code Playgroud)

但是如何在Applicative不对其施加额外限制的情况下定义其实例是没有办法的r.特别是,没有办法如何定义pure :: a -> (r, a)任意的r.

问题1:为什么会这样?以下是如何pure使用f类型的函数a -> b:

(pure f) (pure x, pure y) = (pure x, pure f y)
Run Code Online (Sandbox Code Playgroud)

从那里,定义pure :: a -> (r, a)可能取决于什么r.例如,如果rInteger,则可以定义

pure x = (0 :: Integer, x)
Run Code Online (Sandbox Code Playgroud)

在您的实例声明中.那么问题是什么?

问题2:我们可以说一般来说,如果F是仿函数,那么<*> …

haskell category-theory applicative

7
推荐指数
2
解决办法
525
查看次数

具体类型无法成为应用程序的Functor示例?

来自不适用的仿函数:

一个类型构造函数,它是一个Functor但不是Applicative.一个简单的例子是一对:

instance Functor ((,) r) where
    fmap f (x,y) = (x, f y)
Run Code Online (Sandbox Code Playgroud)

但是如何在Applicative不对其施加额外限制的情况下定义其实例是没有办法的r.特别是,没有办法如何定义pure :: a -> (r, a)任意的r.

在这里,pure不能同时为所有类型定义; 但是,对于任何具体类型T,人们都可以((,) T)申请.

问题:是否有一个具体仿函数的例子(即,没有涉及类型变量)是一个仿函数而不是一个应用程序?

haskell category-theory

7
推荐指数
1
解决办法
284
查看次数

在函数式编程术语中,使用 orElse 或其他后备方法的东西怎么称呼?

以 scala 为参考,我们在几个地方看到了后备行为 ( orElse),例如PartialFunctionOption和 cats EitherOps

这感觉类似于单子的扁平化行为,但又不同。是否有函数式编程术语来描述表现出这种行为的事物?

编辑:到目前为止,我发现了一些很好的答案,在猫身上进行了更多挖掘

Semigroup[Option[String]].combine(None, Some("b"))
res0: Option[String] = Some(b)

Semigroup[Option[String]].combine(Some("a"), Some("b"))
res1: Option[String] = Some(ab)

SemigroupK[Option].combineK(None, Some("b"))
res2: Option[String] = Some(b)

SemigroupK[Option].combineK(Some("a"), Some("b"))
res3: Option[String] = Some(a)

SemigroupK[List].combineK(List("a"), List("b"))
res4: List[String] = List(a, b)

Alternative[List].unite(List(None, Some("a"), Some("b")))
res4: List[String] = List(a, b)
Run Code Online (Sandbox Code Playgroud)

所以我现在发现 scalazAlt和 haskellAlternative与 cats 不太一样Alternative。更有趣的是(根据 cats 文档在 scalaz 中SemigroupK调用)。 那么我们是否可以说这种行为是由一种类型表现出来的,如果没有其内部类型的半群,则无法为其定义半群(因为这样我们可能会说 scalaz和 haskell是此类的半群)?Plus
AltAlternative

functional-programming scala partialfunction scala-cats

6
推荐指数
1
解决办法
359
查看次数

在类Functor的声明中,类型变量可以是函数类型吗?

在Haskell中,该类Functor声明为:

class   Functor f   where
fmap    ::  (a  ->  b)  ->  f   a   ->  f   b
Run Code Online (Sandbox Code Playgroud)

可以输入变量ab是函数类型,或者他们必须是非功能类型?

如果它们可以是函数类型,那么就可以使类应用于具有任意数量的参数的函数而言,类是否与class Functor有效地相同?根据赫顿在《 Haskell编程》中所说:Applicativefmap

函子抽象了fmap将功能映射到结构的每个元素上的想法 。应用程序将此想法概括为允许 fmap映射具有任意数量参数的映射函数,而不是仅限于具有单个参数的函数。

适用:

fmap0 ::  a   ->  f   a
fmap0 =   pure
fmap1 ::  (a  ->  b)  ->  f   a   ->  f   b
fmap1 g   x   =   pure    g   <*> x
fmap2 ::  (a  ->  b   ->  c)  ->  f   a   ->  f   b   -> …
Run Code Online (Sandbox Code Playgroud)

haskell functor applicative

5
推荐指数
3
解决办法
160
查看次数

在Haskell中有没有仿函数的函子实例,因为我们不能实现return?

在Haskell中有没有因为我们无法实现而不能成为单子的函子的示例return

我已经看到了这个答案,并从中得到启发。

直观地看来,我们总是可以return使用类型构造函数来实现。但是我一定想念一些东西。

haskell

5
推荐指数
2
解决办法
139
查看次数

您可以编写一个类型函数来反转约束吗?

是否可以编写一个类型函数,使其具有Show之类的约束,然后返回将RHS约束为非 Show实例的类型的函数?

签名将类似于

type family Invert (c :: * -> Constraint) :: * -> Constraint
Run Code Online (Sandbox Code Playgroud)

haskell constraint-kinds data-kinds

3
推荐指数
1
解决办法
100
查看次数

有什么情况可以/不能有数据类型的Functor实例?

考虑到类型* - >*的类型,我试图找到规则并建立直觉,当你可以,当你不能有这种类型的Functor.

到目前为止,我看到的规则如下:

  1. 没有Functor包含值限制的容器类型的实例.

示例:您不能拥有Functor实例,Set因为Ord包含的值需要

  1. 没有Functor逆变数据类型的实例.

例:

newtype Contra a = Contra (a -> Int)
Run Code Online (Sandbox Code Playgroud)

除此之外,还有其他情况吗?

haskell functor typeclass category-theory

2
推荐指数
2
解决办法
158
查看次数