我是 Haskell 新手,所以如果你觉得这个问题微不足道,请原谅:
我如何让 GHCi 接受这种声明:let foo = fmap (*3) . fmap (+10)
?
我尝试向 foo ( let foo :: [Int] -> [Int] =
etc) 添加类型声明以使仿函数类型显式但编译器会响应Illegal Signature
。
谢谢!
编辑 - 显然有很多方法可以做到这一点。我选择了 Tikhon 的答案,因为他是第一个,而且相当直观。谢谢大家!
我是 Haskell 新手,所以如果你觉得这个问题微不足道,请原谅:
我如何让 GHCi 接受这种声明:let foo = fmap (*3) . fmap (+10)
?
我尝试向 foo ( let foo :: [Int] -> [Int] =
etc) 添加类型声明以使仿函数类型显式但编译器会响应Illegal Signature
。
谢谢!
编辑 - 显然有很多方法可以做到这一点。我选择了 Tikhon 的答案,因为他是第一个,而且相当直观。谢谢大家!
在 ghci 中给出类型签名,不需要任何扩展的最好方法是用分号分隔签名和绑定,
let foo :: Num n => [n] -> [n]; foo = map (*3) . map (+ 10)
您可以给表达式(即fmap (* 3) . fmap (+ 10)
)一个签名,而不是给它foo
。所以:
let foo = fmap (* 3) . fmap (+ 10) :: [Int] -> [Int]
完整的错误读取
Illegal signature in pattern: [Int] -> [Int]
Use -XScopedTypeVariables to permit it
解决方案是运行
:set -XScopedTypeVariables
现在你可以尝试运行你的let foo :: [Int] -> [Int] = fmap (*3) . fmap (+10)
,它会工作的。
:set -XNoMonomorphismRestriction