latter m n = [[m..n],drop (n - m + 1)/2]
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/23 13:39
2017/04/23 14:07
回答1件
0
ベストアンサー
追記:エラーを解釈しようと興味に従い回答してみたのですが、質問コメント見落としてました。
いろんな意味で役に立たない回答のようです。失礼しました。
この関数のおかしいところを教えてくださいとのことなので・・・
Haskell素人ですので解釈ミスがあると思いますが、WinGHcとリファレンスや解説記事をあさりつつ解釈を試みました。
- 定義全体のエラー
(A)
haskell
1Prelude> latter m n = [[m..n],drop (n - m + 1)/2] 2<interactive>:82:22: error: 3 ? Couldn't match expected type ‘[Int]’ 4 with actual type ‘[a0] -> [a0]’ 5 ? Probable cause: ‘(/)’ is applied to too few arguments 6 In the expression: drop (n - m + 1) / 2 7 In the expression: [[m .. n], drop (n - m + 1) / 2] 8 In an equation for ‘latter’: 9 latter m n = [[m .. n], drop (n - m + 1) / 2]
最初のCouldn't match expected type ‘[Int]’は自分には難しいですが、
[m..n]と書かれていることからHaskellはm,nがIntであると推論したのだと思います。そこで
[[m..n],...]は[[Int]]であろうと推論したのだと思います。そこで
[[m..n], drop (n - m + 1) / 2]の2要素目の型は[Int]でなければならないのですが、
drop以下の太字の部分の式の型は[Int]ではないと文句を言っているように見えました。
- drop (n - m + 1) / 2
drop (n - m + 1) / 2
は (drop (n - m + 1)) / 2
と解釈されると思います。演算子よりメソッド適用の優先度が高いようですので。/とdropの定義をWinGHcにある:iというので見てみると...
(B)
haskell
1Prelude> :i (/) 2class Num a => Fractional a where 3 (/) :: a -> a -> a 4 ... 5 -- Defined in ‘GHC.Real’ 6infixl 7 / 7Prelude> :i drop 8drop :: Int -> [a] -> [a] -- Defined in ‘GHC.List’
と出ることからNum(のひとつFractional)に対してしか/
は適用できないようです。dropはIntとリストを取ってリストを結果とする関数なので、drop xはリストを取ってリストを返す関数ということになろうかと思います。よってdrop x(=関数)に対する/
の適用は評価できないため(B)(A)の2点からこの定義が成立しないということなのだと思います。
投稿2017/04/23 21:22
編集2017/04/27 11:58総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。