2

私はこのファイルを持っています:

{-# 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

4

1 に答える 1

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

したがって、 lens はレンズを生成できません。エラーが出ないのはなぜですか?そうですね、レンズを生成できる追加のフィールドがある場合があります。ここではそうではないように見えますが、一般的に makeLenses は不可能なことをすべてスキップして、残りを生成しようとするだけだと思います。

于 2013-06-22T23:05:52.767 に答える