在Haskell中绑定部分应用的函数

时间:2012-07-31 23:55:19

标签: haskell partial-application

我是Haskell的新手,所以如果你发现这个问题很简单,请原谅我:

我如何让GHCi接受此类声明:let foo = fmap (*3) . fmap (+10)

我尝试向foo(let foo :: [Int] -> [Int] =等)添加一个类型声明,以使functor类型显式,但编译器响应Illegal Signature

谢谢!

编辑 - 显然有很多方法可以做到这一点。我选择了Tikhon的答案,因为他是第一个,而且相当直观。谢谢大家!

4 个答案:

答案 0 :(得分:9)

要在ghci中提供类型签名,最好的方法,不需要任何扩展,是用分号分隔签名和绑定,

let foo :: Num n => [n] -> [n]; foo = map (*3) . map (+ 10)

答案 1 :(得分:5)

您可以为表达式(即fmap (* 3) . fmap (+ 10))提供签名,而不是将其提供给foo。所以:

let foo = fmap (* 3) . fmap (+ 10) :: [Int] -> [Int]

答案 2 :(得分:3)

完整错误读取

Illegal signature in pattern: [Int] -> [Int]
    Use -XScopedTypeVariables to permit it

解决方案是运行

:set -XScopedTypeVariables

现在,您可以尝试运行let foo :: [Int] -> [Int] = fmap (*3) . fmap (+10),它可以正常运行。

答案 3 :(得分:1)

:set -XNoMonomorphismRestriction