Haskell反向函数应用运算符(&)无法工作的原因咨询
为什么Haskell的反向函数应用运算符(&)无法工作?
这个问题我之前刚接触Haskell时也踩过坑,其实原因很简单——你还没导入&运算符所在的模块!
你看到的错误Variable not in scope: (&) :: [Char] -> ([a0] -> Int) -> t,核心问题是**&并不在GHC默认加载的Prelude模块导出列表里**,它属于Data.Function模块,所以默认情况下GHCi或你的代码里找不到这个符号。
快速解决方法
1. 在GHCi中临时导入
直接在GHCi提示符下执行导入命令:
Prelude> import Data.Function (&)
或者导入整个Data.Function模块:
Prelude> import Data.Function
之后再运行你的代码:
Prelude Data.Function> "hello" & length 5
就能得到你期望的结果了。
2. 在Haskell源码中导入
如果是写在.hs文件里,只需要在文件顶部加上导入语句:
import Data.Function (&) -- 仅导入&运算符,避免引入多余内容 -- 或者 import Data.Function -- 导入整个模块的所有函数
额外补充:&和$的区别
可能你已经熟悉正向函数应用运算符$,&其实就是它的反向版本:
f $ x等价于f x,作用是减少括号嵌套,让代码从右往左读更顺畅x & f同样等价于f x,适合把函数调用链按从左到右的管道风格书写
举个直观的例子:
-- 原生写法(括号嵌套多) length (map toUpper (filter (/='l') "hello")) -- 用$的写法(从右往左读) length $ map toUpper $ filter (/='l') "hello" -- 用&的写法(从左往右读,像流水线) "hello" & filter (/='l') & map toUpper & length
这种管道风格在处理多步连续操作时,可读性会明显更高。
内容的提问来源于stack exchange,提问作者a544jh
相关产品推荐
相关产品推荐

