2017-12-17 17 views
1

DuplicateRecordFields(+ OverloadedLabels)拡張機能を使用しています。レコードの更新で曖昧さを解消できない状況に遭遇しました。ここでDuplicateRecordFieldsでレコードの曖昧さを修正する

は簡単な例です:

data A = A { name :: String } 
data B = B { name :: String } 

combine :: A -> B -> A 
combine a b = a { name = name b } 

は、この作品を作るための方法はありますか?

答えて

1

あなたはパターンから名前を一致させることができます:

data A = A { name :: String } 
data B = B { name :: String } 

combine :: A -> B -> A 
combine a B{name = nb} = a { name = nb } 

私もDuplicateRecordFieldsのファンではありません。代わりにthe lens routeに行ってみませんか?

{-# LANGUAGE TemplateHaskell, FlexibleInstances, FunctionalDependencies #-} 

import Control.Lens 
import Control.Lens.TH 

data A = A { _aName :: String } 
makeFields ''A 
data B = B { _bName :: String } 
makeFields ''B 

combine :: A -> B -> A 
combine a b = a & name .~ b^.name 
+0

'-XNamedFieldPuns'では' B {name} = a {name = name} 'を組み合わせることもできます。 – danidiaz

+0

@danidiaz _can_私たちはこれを行いますか?まあ、あなたがそう言うなら。私たちはどんな速度でもできません。 '{name = name}'は完全に混乱しています。これらのすべての拡張は、この方法ではうまく機能しない古いレコードシステム内のユニドーマックなハックです。 'OverloadedRecordFields'が' HasField'クラスとmagic-hash構文を使って正常に動作するとき、これは別のペアになりますが、それまではレンズライブラリが提供するものに固執します。 – leftaroundabout

2

私は現在、GHCはその引数からレコードフィールドの種類を推測することはありません-XDuplicateRecordFieldsについて、前の質問のいずれかで答え:

をあなたは今何ができますか

{-# LANGUAGE DuplicateRecordFields #-} 

data A = A { name :: String } 
data B = B { name :: String } 

combine :: A -> B -> A 
combine a b = a { name = (name :: B -> String) b } 
エクストラクタのタイプを明示的に指定することです。