存在量词会无声地破坏Template Haskell(makeLenses)。为什么?

时间:2013-06-22 22:55:39

标签: haskell template-haskell lenses

我有这个文件:

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ExistentialQuantification #-}

module Toy where

import Control.Lens

data Bar = Bar { _barish :: String }
data Foo = forall a. Show a => Foo { _fooish :: a }

$(makeLenses ''Bar)
$(makeLenses ''Foo)

x = barish
y = fooish

我收到以下错误消息:

Toy.hs:15:5:
    Not in scope: `fooish'
    Perhaps you meant `_fooish' (line 9)

这是我第一次尝试使用存在量词;我不知道为什么这些功能组合会中断。更令人担忧的是,为什么我没有收到有关makeLenses失败的错误消息?我跑了runhaskell Toy.hs

1 个答案:

答案 0 :(得分:5)

你实际上无法使用你的函数_fooish。如果您尝试这样做,则会收到错误:

Cannot use record selector `_fooish' as a function due to escaped type variables
Probable fix: use pattern-matching syntax instead
In the expression: _fooish

因此镜头无法为您生成镜头。为什么不给出错误?好吧,有时候你有额外的领域可以生成镜头。这似乎不是这里的情况,但我认为通常makeLenses只是跳过一切不可能做的事情并试图产生其余部分。