學習Haskell的第一原則。 Haskell的絕對初學者。 如果:Haskell定義類型
data A
data B
func :: A -> B
func = undefined
實際功能是什麼?雖然鍛鍊負荷很大(也感謝你),但我再次卡住了。 A - > B是否表示兩種不同的類型,如'字符串' - >'字符'?試圖把我的頭包裹起來。
學習Haskell的第一原則。 Haskell的絕對初學者。 如果:Haskell定義類型
data A
data B
func :: A -> B
func = undefined
實際功能是什麼?雖然鍛鍊負荷很大(也感謝你),但我再次卡住了。 A - > B是否表示兩種不同的類型,如'字符串' - >'字符'?試圖把我的頭包裹起來。
不,(具體)類型以大寫字母開頭。所以A -> B
意味着類型A
和B
您已經定義(當然這裏不是定義)與data A = ...
表情,例如像:
data A = Foo | Bar Int | Qux String A
萬一簽名包含有小寫的標識符,它是一個類型變量。例如foo :: a -> b
,意思是a
和b
可以被任何類型取代。所以foo
是一個函數,可以是A -> B
,但也可以是A -> Int
,Char -> B
和Char -> Int
。
您還可以添加類型約束的簽名,以限制可用於其例如a
和b
類型。類似於foo :: (Show a, Num b) => a -> b
限制了a
和b
,使得對於類型a
和b
存在instance Show a
和instance Num b
,使得foo
被定義在這些類型上。
謝謝威廉,謝普納。你的答案幫助我想出了:
data A
data B
funcAJ :: A -> B
funcAJ a = a
where a = b
b = undefined
這種類型爲funcAJ :: A - > B,據我瞭解。非常感謝!
這不符合你的想法。 'where'中的'a'正在映射函數參數'a'。它們是具有相同名稱的不同變量。作爲函數參數的'a'是類型'A',而函數'where'中定義的函數是'B'類型。這是因爲它被定義爲評估爲'b',而後者被定義爲'undefined'。未定義可以承擔(幾乎)任何類型。所以這只是寫'funcAJ a = undefined'的一種奇特的方式。 – Potato44
好的。謝謝,但我寄予了很高的期望。我現在失去了。你能提出一個類型檢查並且正確的函數嗎? – Madderote
除非你給你的類型'A'和'B',一些數據構造函數'undefined'(或者其他返回底部的構造函數)是'A - > B'類型函數的唯一可能的實現。 – Potato44
沒有大寫字母是真正的類型。小寫字母是類型變量。 –
如果這是實際的代碼,那麼'undefined'在某種意義上是'func'的唯一有效定義。 'B'沒有人居住,所以無法從'func'返回'B'的值。 (對於這個問題,也沒有辦法調用'func',因爲沒有任何'A'作爲參數提供的值。) – chepner