引数のないHaskell多変量関数

アルテミスヤング

Haskellで多変量関数を作成しようとしていますこの回答を使用して、基本的な関数を作成しました。関数のコードは次のとおりです。

class SumRes r where 
    sumOf :: Integer -> r

instance SumRes Integer where
    sumOf = id

instance (Integral a, SumRes r) => SumRes (a -> r) where
    sumOf x = sumOf . (x +) . toInteger

しかし、問題は次のとおりです。関数が引数なしで呼び出されると、機能しません。

Couldn't match expected type 'Integer' with actual type 'Integer -> r0'
    Probable cause: 'sumOf' is applied to too few arguments

たとえば、sumOf :: Integerこの関数を記述して、この関数を返してもらいたいと思い0ます。

どうすればよいですか?

dfire

最も単純なバージョンはInteger結果に対してのみ機能します。

簡単な方法

これ0は、追加のアイデンティティであるという事実を利用して、すでに書いたものをうまく処理します

class SumRes r where
  sumOf' :: Integer -> r

instance SumRes Integer where
  sumOf' = toInteger

instance (Integral b, SumRes r) => SumRes (b -> r) where
  sumOf' a b = sumOf' $! a + toInteger b

sumOf :: SumRes r => r
sumOf = sumOf' 0

2つのインスタンス、Integerおよびはb -> r、本質的に重複しません。

より難しい方法

より一般的な結果タイプを取得するには、多少異なるアプローチが必要です。これは、上記の2つのインスタンスIntegerがタイプ変数に置き換えられると、一緒にマッシュアップするためです。あなたがこれを行うことができますMultiParamTypeClassesし、TypeFamilies

{-# LANGUAGE ScopedTypeVariables, AllowAmbiguousTypes, DataKinds,
      KindSignatures, TypeApplications, MultiParamTypeClasses,
      TypeFamilies, FlexibleInstances #-}

module SumRes2 where

data Nat = Z | S Nat
class SumRes (c :: Nat) r where
  sumOf' :: Integer -> r

type family CountArgs a :: Nat where
  CountArgs (_ -> r) = 'S (CountArgs r)
  CountArgs _ = 'Z

instance Num r => SumRes 'Z r where
  sumOf' = fromInteger

instance (Integral b, SumRes n r) => SumRes ('S n) (b -> r) where
  sumOf' a b = sumOf' @n (a + toInteger b)

sumOf :: forall r n. (SumRes n r, CountArgs r ~ n) => r
sumOf = sumOf' @n 0

唯一の制限はIntegral、関数型のインスタンスがある場合、それsumOf生成するため使用できないことです。しかし、それは実際には問題ではないはずです。私が使ってきたTypeApplicationsし、AllowAmbiguousTypes簡潔にするために、しかし、あなたは確かにプロキシ通過を使用したりすることができますTagged代わりに。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

多変量関数の合成

分類Dev

Haskell、多変量関数と型推論

分類Dev

haskellの多変量関数の結果タイプ

分類Dev

`...`のない可変個引数関数

分類Dev

名前付き引数のない可変個引数関数

分類Dev

引数のないC ++可変個引数関数

分類Dev

多くの引数を持つ関数のジュリアで単変量根を見つける

分類Dev

可変量の引数を明示的な量に変換する

分類Dev

可変個引数関数が最初の引数を正しく渡さない

分類Dev

効率的な可変個引数が等しい-任意の関数

分類Dev

型のない関数の引数宣言

分類Dev

Haskellの複数の引数関数

分類Dev

引数関数が1つしかないのは効率的ですか?Haskell

分類Dev

関数で動的な量の引数を渡す方法

分類Dev

引数の数が異なるHaskell関数

分類Dev

引数のないconstexpr関数

分類Dev

引数のないJavasript配列関数

分類Dev

引数のないRcpp関数

分類Dev

Haskellの可変個引数関数型クラス

分類Dev

[] interface {}を非多様関数への引数に変える

分類Dev

Tensorflowの多変量関数を最小化する

分類Dev

Haskell関数の引数型宣言の違い

分類Dev

関数の引数としての名前のない関数?

分類Dev

関数の引数としての名前のない関数?

分類Dev

sympyを使用した多変量関数のテイラー級数の計算

分類Dev

printf関数の可変個引数関数が機能しないのはなぜですか?

分類Dev

Haskell関数は、複数の引数ではなく、いつタプルを取るべきですか?

分類Dev

関数の引数の動的変数

分類Dev

関数内の可変数の引数

Related 関連記事

ホットタグ

アーカイブ