質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Q&A

解決済

Haskellの(x : xs)をしりたい

退会済みユーザー

退会済みユーザー

総合スコア0

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

2回答

0グッド

0クリップ

661閲覧

投稿2021/06/14 11:52

Haskellでappend[1,2,3][4,5]を入力すると[1,2,3,4,5]を出力するappend関数がよくわかりません。
(x : xs) ysでなにをやっているかわからないのでこちらのサイトを参考にしてtrace でデバッグしたいのですが
? No instance for (Show a) arising from a use of ‘show’
Possible fix:
add (Show a) to the context of
the type signature for:
append :: forall a. [a] -> [a] -> [a]
? In the first argument of ‘(++)’, namely ‘show x’
In the first argument of ‘trace’, namely
‘(show x ++ "" ++ show xs ++ "" ++ show ys)’
In the first argument of ‘($)’, namely
‘trace (show x ++ "" ++ show xs ++ "" ++ show ys)’
|
15 | trace (show x++""++show xs++""++show ys) $ --デバッグ
上記のエラーが吐かれます。
どのようにしたらappend (x : xs) ys =x : append xs ysを視覚化できるか教えてください

Haskell

1append :: [a] -> [a] -> [a] 2append [] ys = ys 3append (x : xs) ys = 4 trace (show x++""++show xs++""++show ys) $ --デバッグ 5 x : append xs ys 6

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

0

とりあえず、型をこのように指定すれば通ります。

haskell

1append :: Show a => [a] -> [a] -> [a]

ただ、これだとトレース結果が見づらいので、こんな感じでどうでしょうか。

haskell

1append :: Show a => [a] -> [a] -> [a] 2append [] ys = ys 3append (x : xs) ys = 4 trace (show x++""++show xs++""++show ys) $ --デバッグ 5 let rs = append xs ys in rs `seq` x : rs

投稿2021/06/14 12:59

actorbug

総合スコア1758

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2021/06/14 23:07

ありがとうございます

0

ベストアンサー

結論からいうと、下記のように、引数の型a(厳密には、型変数aが表す型)にShow型クラスの制約を加えましょう:

haskell

1append :: Show a => [a] -> [a] -> [a] 2-- ... 以下省略 ...

エラーメッセージにおける

Possible fix:

add (Show a) to the context of
the type signature for:
append :: forall a. [a] -> [a] -> [a]

とは、まさにそのことを差しています。

Haskellにおいて型変数aで表される型というのは、Show a => ...と書いて型クラスの制約を明示しない限り、「あらゆる型の内一つ」という意味になります。「あらゆる型」の中にはShow型クラスのインスタンスでない、言い換えればshow関数で文字列に変換できない型もたくさんあります(例えばIO型)。
Show a =>のついてないappend :: [a] -> [a] -> [a]関数だと、そのようなshow関数が使えない型に対しても使用できなければならなくなるので、挙げたようなエラーが発生します。

投稿2021/06/14 12:49

igrep

総合スコア423

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2021/06/14 23:07

ありがとうございます

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。