如何构建镜头以传递给purescript的“Thermite.focus”?

时间:2017-06-19 03:07:43

标签: purescript

我正在关注有关设置任务列表的各种Thermite教程。唯一有很多解释的教程也已经过时了,所以我修改它以适应当前的Thermite。但是,我有一个调用,我无法使数据类型匹配。

import Optic.Lens (lens)
import Optic.Prism (prism)
import Optic.Types (Prism', Lens')
import Thermite as T

_TaskAction :: Prism' TaskListAction (Tuple Int TaskAction)
_TaskAction = ...

_tasks :: Lens' TaskListState (L.List TaskState)
_tasks = lens _.tasks (_ { tasks = _ })

taskList :: T.Spec _ TaskListState _ TaskListAction
taskList = T.focus _tasks _TaskAction taskSpec

但是,这给了我一条错误消息:

  Could not match type

    p0

  with type

    Function

while trying to match type p0 t1
  with type Function             
              (List              
                 { text :: String
                 }               
              )                  
while checking that expression _tasks
  has type p0 t1 t1 -> p0 t2 t2
in value declaration taskList

where p0 is a rigid type variable
        bound at line 213, column 20 - line 213, column 26
      t1 is an unknown type
      t2 is an unknown type

错误消息专门讨论了我传递给_tasks的{​​{1}}参数。但我不知道这个错误试图告诉我什么。我也知道T.focus的类型签名是......

T.focus

所以,第一个参数是镜头。

更令人沮丧的是,我检查了更现代(但更大,更不易理解)的示例代码,它显示的focus :: forall eff props state2 state1 action1 action2. Lens' state2 state1 -> Prism' action2 action1 -> Spec eff state1 props action1 -> Spec eff state2 props action2 与我在这里的定义完全相同。

那么,这个错误消息意味着什么,我需要做些什么来解决它?

1 个答案:

答案 0 :(得分:2)

您导入Optic.Lens的事实表明您在此处使用了错误的镜头库。 purescript-lens提供传统的van-Laarhoven镜头(如Haskell的lens库),但Thermite使用profunctor-lenses库。