解釋

2016-09-27 179 views
1

我在看的代碼包含這個頂級功能:解釋

starman :: String -> Int -> IO() 
starman word n = turn word ['-' | x <- word] n 

我可以看到,這是一個函數,需要兩個參數,然後調用轉功能,看起來像這樣:

turn :: String -> String -> Int -> IO() 
turn word display n = 
    do if n==0 
     then putStrLn "You lose" 
     else if word==display 
       then putStrLn "You win!" 
       else mkguess word display n 

什麼我不明白是什麼意思呢:

word ['-' | x <- word] 

回答

5

實線爲:

starman word n = turn word ['-' | x <- word] n 

turn被稱爲有三個參數:

word 
['-' | x <- word] 
n 

,中間的是您遇到的麻煩之一。它可以被理解爲:「單詞中的每個字符的連字符」。

所以['-' | x <- "hello"]"-----"

該構建體被稱爲list comprehension

編輯

列表內涵做同樣的事情,因爲這,這也許是在意圖更清晰?

replicate (length word) '-' 
+0

的'replicate'版本不具有無限字符串的工作。 – melpomene

+0

是的。我想這在這裏不可能。 – smarx

+0

@melpomene不,但在轉向功能中使用的== ==。無限列表在這裏不是真正的問題。 – Cubic

2

word是第一個參數turn功能。

['-' | x <- word]是第二個參數,它是含有一個'-'用於word每個字母x列表。事實上,我們給每個字母名稱x完成任何事情,雖然我們從來沒有提到它,所以我們不妨寫['-' | _ <- word]

該語法被稱爲列表理解,其目的是看起來類似於設置符號。

1

實際上,在下面的表達式

turn word ['-' | x <- word] n 

有一個函數(turn)調用,以三個參數:word['-' | x <- word],和n。所以['-' | x <- word]獨立於word

現在,['-' | x <- word]是什麼意思?這是一個列表理解,所以它是一個構造列表的表達式。爲了理解這一點,你必須記住haskell中的字符串只是字符列表。所以word是一個列表。 x <- word意味着:將列表word的每個元素稱爲該元素x,然後對於每個這樣的元素,評估表達式'-'並將所有這些值收集到列表中。在這種情況下,表達式'-'未引用x,因此它總是會評估爲'-'。換句話說,我們將字符列表word並創建一個列表,其中每個元素字符將被'-'替換。

這裏有一些等價的方式做同樣的事情:

['-' | _ <- word]    -- use the anonymous variable, we don't need the element 
map (\_ -> '-') word 
map (const '-') word 
'-' <$ word     -- my favorite one! 
replicate (length word) '-' -- the least preferrable way