2017-02-14 9 views
0

그래서 사용자가 문자열에 "아니오"또는 "아니오"를 입력했는지 감지하려고하는 haskell에서 다음 코드를 시도했습니다. 또한 [[Char]]를 String으로 대체하려고 시도했지만 컴파일 오류가 발생합니다.Haskell 함수에서 문자열을 전달하는 중 오류가 발생했습니다.

wantGifts :: [[Char]] -> [[Char]] 
    wantGifts st = [if (x == "No" || x== "no") then "No gifts given" else "But why" | x <- st, x == head st] 

위의 코드는 컴파일하지만 난 그것에 문자열을 전달하면 오류 메시지가 반환 밀접 wantGifts의 종류에

*Main> wantGifts "no I dont" 

<interactive>:8:11: 
    Couldn't match type ‘Char’ with ‘[Char]’ 
    Expected type: [[Char]] 
     Actual type: [Char] 
    In the first argument of ‘wantGifts’, namely ‘"no I dont"’ 
    In the expression: wantGifts "no I dont" 
    In an equation for ‘it’: it = wantGifts "no I dont" 
+0

오류는 함수가 문자열 (목록을 기대하고 있다고리스트의-목록 -of-chars). 그러나 당신은 하나를 넘어 가지 않습니다. – chi

답변

2

봐, 그것은 char의 목록의 목록이 필요합니다. 그러나 "no I dont"String이고 단지 [Char]입니다. 현재 건설로, 당신은 사용해야합니다 :

wantGifts ["no I dont"] 

이를 개선 할 수있는 몇 가지 방법이 있습니다, 최고의 Text을 사용하는 것입니다.

import Data.Text (Text) 
import qualified Data.Text as T 
wantGifts :: Text -> Text 
wantGifts txt = if (T.isInfixOf "no" . T.toLower) txt then "No gifts given" else "But why" 
2

문자열 목록을 취할 때 wantGifts을 정의했습니다. [[Char]][String]과 같습니다. REPL에서는 단일 문자열을 전달합니다. 대신 이런 짓을하면

, 그것은 컴파일 것 :

wantGifts ["no I dont"] 

그러나, 나는 이것이 당신이 원하는하지 않은 예감이있다. 당신이 단어 "no" 어디 문자열의 여부를 감지하려고 한 경우

, 당신은 words 기능을 사용할 수 있습니다

containsNo :: String -> Bool 
containsNo = any (\w -> w == "no" || w == "No") . words 
+0

감사합니다. \ w와 모든 부분을 설명 할 수 있다면 감사 할 것입니다. – Sudhanshu

+1

익명 함수를위한 lambda 구문입니다. [좋은 설명입니다] (https://wiki.haskell.org/Anonymous_function). –

+1

@Sudhanshu [LearnYouAHaskell] (http://learnyouahaskell.com/higher-order-functions)는 또한 배울 수있는 훌륭한 자료입니다. – jkeuhlen

관련 문제