Haskell Lens代码报错:字符串/字符字面量末尾词法错误
问题分析与修复方案
错误原因
你遇到的lexical error in string/character literal at end of input错误,根源是字符串字面量的语法错误:
在代码的["super, "cali"]部分,第一个字符串"super,没有正确闭合引号——你在super,后直接写了"cali",这里的第二个引号会被解析器判定为第一个字符串的结束标记,导致后续的cali变成无引号包裹的非法内容,最终触发语法解析失败。
修复后的代码
根据语义需求,有两种修正方式:
方式1:两个独立的字符串(去掉逗号)
如果你的原意是"super"和"cali"两个独立元素,修正代码如下:
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE InstanceSigs #-} import Control.Lens import Control.Applicative foldOf ( both . each ) (["super", "cali"], ["fragilistic", "expialidocious"])
方式2:保留逗号的单个字符串
如果你的原意是"super,"(带逗号)和"cali",修正代码如下:
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE InstanceSigs #-} import Control.Lens import Control.Applicative foldOf ( both . each ) (["super,", "cali"], ["fragilistic", "expialidocious"])
修复效果说明
修正语法后,代码可正常编译运行:foldOf (both . each)会遍历元组中两个列表的所有元素,利用String的Monoid特性,将所有字符串拼接成一个完整结果——方式1会得到"supercalifragilisticexpialidocious",方式2会得到"super,cali fragilisticexpialidocious"。
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

