2017-02-14 8 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] 

上記のコードはコンパイルが、私はそれに文字列を渡すとき、それはエラーメッセージを返します。

*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)、あなたは1つも渡しません。 – chi

答えて

2

wantGiftsの種類をよく見て、それは文字数のリストの一覧が必要です。しかし、"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

これは匿名関数のラムダ構文です。 [これは良い説明です](https://wiki.haskell.org/Anonymous_function)。 –

+1

@Sudhanshu [LearnYouAHaskell](http://learnyouahaskell.com/higher-order-functions)は、学ぶための優れたリソースです。 – jkeuhlen

関連する問題