解释

2016-09-27 174 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