2014-09-20 59 views
0

有什么办法可以为lambda函数的输入变量定义一个类型。我这有一个功能在lambda函数内定义类型

bstar :: Language -> Int -> Language 
bstar l n = 
    case l of 
    [] -> zero 
    l -> case n of 
      0 -> [[]] 
      n -> (\pow l n -> if n == 0 
           then [[]] 
           else l `cat` (pow l (n-1))) l n `uni` (bstar l (n-1)) 

当我编译这个在Haskell我得到的不匹配错误类型“诠释”与“串”。我想知道是否有任何方法可以将lambda函数“pow”l的输入变量定义为语言。 任何想法?

+2

'cat'和'uni'是什么类型?明确定义'l'的类型可能会帮助您本地化类型错误,但似乎您确实在某处需要纠正错误。 – 2014-09-20 23:03:23

+0

@GaneshSittampalam CAT和UNI都有类型:语言 - >语言 - >语言。 – 2014-09-20 23:05:50

+0

是语言类型的同义词吗?它的定义是什么? – 2014-09-20 23:09:35

回答

4

您可以使用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 questionfix更多的讨论。

+0

谢谢,这就是我在冒险之前做的,班轮功能。要进一步调查Fix。 – 2014-09-20 23:29:25

4

也许您正在寻找这样的事情:

bstar :: Language -> Int -> Language 
bstar l n = 
    case l of 
    [] -> zero 
    l -> case n of 
      0 -> [[]] 
      n -> pow l n `uni` bstar l (n-1) 
    where pow :: Language -> Int -> Language 
     pow l n = if n == 0 
        then [[]] 
        else l `cat` pow l (n-1) 

让我“restyle”了一下你的代码,希望使之更加清晰。

bstar :: Language -> Int -> Language 
bstar [] _ = zero 
bstar _ 0 = [[]] 
bstar l n = pow l n `uni` bstar l (n-1) 
    where pow :: Language -> Int -> Language 
     pow _ 0 = [[]] 
     pow l n = l `cat` pow l (n-1) 
相关问题