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

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

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

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

Q&A

2回答

381閲覧

Haskellにおけるパターンマッチの動作

mightyMask

総合スコア143

Haskell

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

0グッド

0クリップ

投稿2018/11/20 17:58

Haskell

1data Data = Data Int 2 3d :: Data 4d = Data 1 5 6func :: Data -> Bool 7func (Data 1) = True 8func (Data _) = False

Haskell

1data Data = Data Int 2 3d :: Data 4d = Data 1 5 6func :: Data -> Bool 7func d = True 8func (Data _) = False

最初のコードだと期待通りの動作をしますが、2番目だと期待通りに動きません。
どうにかなりませんか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

パターンの部分は式ではないので、束縛している値を使うことはできません。文法的には d は変数パターンとなるので、パターンマッチは常に成功します。

  1. Matching the pattern var against a value v always succeeds and binds var to v.

https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-580003.17

PatternSynonyms 拡張を使えば、パターンに仮名を付けることはできます。

{-# LANGUAGE PatternSynonyms #-} data Data = Data Int pattern D <- Data 1 func :: Data -> Bool func D = True func (Data _) = False main = do print $ func $ Data 0

投稿2018/12/03 06:44

hiratara

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。
何が「期待通り」なのか書かれていないのと、「どうにかなる」とはどうなってほしいのかが全然わからないですが。

パターンマッチは上から順にマッチングを行い、マッチしたものに入るので、
最初のコードでは「Dataを分解し、中身が1であるもの」「Dataを分解し、中身がそれ以外であるもの」の順でマッチします。
2番目のコードでは、1つ目のパターンが「Dataを分解せず、それ自体にマッチ」となるので、何を渡してもTrueを返します。
そうなるように書いているからそうなるということです。

投稿2018/11/21 02:16

tamoto

総合スコア4105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問