您可以使用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