您可以使用ScopedTypeVariables
语言扩展,使这句法:
\(x :: Int) -> x
你要么-XScopedTypeVariables
在GHC命令行,或通过将
{-# LANGUAGE ScopedTypeVariables #-}
顶部启用扩展的源文件。
正如我在对该问题的评论中指出的那样,这可能实际上并不能帮助解决您的错误。对于包含你的很多简单的Haskell代码来说,添加一个类型签名实际上并不会使代码在没有其他的情况下进行类型检查。它会做的是让找到类型错误变得更容易,因为它会让你清楚你的意图和编译器推断的不同之处。
编辑下面的评论中讨论:
与您的代码的问题是,你要定义一个递归函数pow
只有一个lambda,这是不能直接成为可能。您的lambda 预计函数pow
作为参数,但您没有传递一个参数。
作为@ chi的回答和注释笔记,您的代码可能会最清晰,而where
子句代替,但如果您确实想保留内联lambda,则还可以使用fix
执行此操作。
它具有以下类型和定义:
fix :: (a -> a) -> a
fix f = let x = f x in x
在这种情况下,a
型将是您pow
函数的期望类型,即(Language -> Int -> Language)
。因此fix
将最终将您的lambda转换为递归定义 - x
中的fix
的定义对应于您的pow
。
bstar :: Language -> Int -> Language
bstar l n =
case l of
[] -> zero
l -> case n of
0 -> [[]]
n -> fix (\pow l n ->
if n == 0
then [[]]
else l `cat` (pow l (n-1))) l n `uni` (bstar l (n-1))
您可能需要在在模块的顶部添加到您的进口:
import Data.Function (fix)
你可以看一下this question为fix
更多的讨论。
'cat'和'uni'是什么类型?明确定义'l'的类型可能会帮助您本地化类型错误,但似乎您确实在某处需要纠正错误。 – 2014-09-20 23:03:23
@GaneshSittampalam CAT和UNI都有类型:语言 - >语言 - >语言。 – 2014-09-20 23:05:50
是语言类型的同义词吗?它的定义是什么? – 2014-09-20 23:09:35