2014-09-20 57 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) 
相關問題