2017-09-16 111 views
2

學習Haskell的第一原則。 Haskell的絕對初學者。 如果:Haskell定義類型

data A 
data B 
func :: A -> B 
func = undefined 

實際功能是什麼?雖然鍛鍊負荷很大(也感謝你),但我再次卡住了。 A - > B是否表示兩種不同的類型,如'字符串' - >'字符'?試圖把我的頭包裹起來。

+0

沒有大寫字母是真正的類型。小寫字母是類型變量。 –

+0

如果這是實際的代碼,那麼'undefined'在某種意義上是'func'的唯一有效定義。 'B'沒有人居住,所以無法從'func'返回'B'的值。 (對於這個問題,也沒有辦法調用'func',因爲沒有任何'A'作爲參數提供的值。) – chepner

回答

5

不,(具體)類型以大寫字母開頭。所以A -> B意味着類型AB您已經定義(當然這裏不是定義)與data A = ...表情,例如像:

data A = Foo | Bar Int | Qux String A 

萬一簽名包含有小寫的標識符,它是一個類型變量。例如foo :: a -> b,意思是ab可以被任何類型取代。所以foo是一個函數,可以是A -> B,但也可以是A -> Int,Char -> BChar -> Int

您還可以添加類型約束的簽名,以限制可用於其例如ab類型。類似於foo :: (Show a, Num b) => a -> b限制了ab,使得對於類型ab存在instance Show ainstance Num b,使得foo被定義在這些類型上。

-1

謝謝威廉,謝普納。你的答案幫助我想出了:

data A 
data B 
funcAJ :: A -> B 
funcAJ a = a 
     where a = b 
      b = undefined 

這種類型爲funcAJ :: A - > B,據我瞭解。非常感謝!

+2

這不符合你的想法。 'where'中的'a'正在映射函數參數'a'。它們是具有相同名稱的不同變量。作爲函數參數的'a'是類型'A',而函數'where'中定義的函數是'B'類型。這是因爲它被定義爲評估爲'b',而後者被定義爲'undefined'。未定義可以承擔(幾乎)任何類型。所以這只是寫'funcAJ a = undefined'的一種奇特的方式。 – Potato44

+0

好的。謝謝,但我寄予了很高的期望。我現在失去了。你能提出一個類型檢查並且正確的函數嗎? – Madderote

+0

除非你給你的類型'A'和'B',一些數據構造函數'undefined'(或者其他返回底部的構造函數)是'A - > B'類型函數的唯一可能的實現。 – Potato44