gpt4 book ai didi

haskell - 镜头和单态性限制

转载 作者:行者123 更新时间:2023-12-03 15:18:02 25 4
gpt4 key购买 nike

我一直在研究本 article 中给出的示例用于创建镜头。

我创建了 Lens如文章所述,以下是我的代码:

{-# LANGUAGE TemplateHaskell #-}
import Control.Lens

type Degrees = Double
type Latitude = Degrees
type Longitude = Degrees

data Meetup = Meetup { _name :: String, _location :: (Latitude, Longitude) }
makeLenses ''Meetup

meetupLat = location._1 :: Lens' Meetup Latitude

现在,除非我包含以下代码,否则此代码不会进行类型检查:
{-# LANGUAGE NoMonomorphismRestriction #-}

但是在文章中没有任何地方,我可以发现他们提到过
关于单态性限制。这是正常的事情还是我
在这里做错了什么?

使用的编译器:GHC 7.6.2

最佳答案

这是正常的事情。 lens库严重依赖多态性,因此单态性限制(这使得事物的多态性比它们可能的少)并不能很好地与之交互。在您的情况下,我认为您也可以这样编写代码:

meetupLat :: Lens' Meetup Latitude
meetupLat = location._1

如果您为绑定(bind)提供显式多态类型签名,则单态限制无关紧要。

请注意 Lens' Meetup Latitude是一种多态类型,即使它看起来是单态的。类型变量隐藏在 Lens' 中类型同义词。尤其是:
Lens' Meetup LatitudedefinedLens Meetup Meetup Latitude Latitude .

Lens Meetup Meetup Latitude Latitudedefinedforall f. Functor f => (Meetup -> f Meetup) -> Latitude -> f Latitude
这就是 f 的全部内容。 .我认为单态限制将强制 f 的具体实例化。 ,但你想保持它是多态的,因为镜头的不同用户会选择不同的 f .例如 view 会选择 Const set 会选择 Identity .因此,保留 f 非常重要。多态性让镜头的用户有这些选择。

关于haskell - 镜头和单态性限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23066099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com