我正在阅读Haskell的书并尝试理解public class MyNiftyAdapter extends CursorAdapter{
private LayoutInflater mInflater;
private Cursor cur;
private Context mContext;
public MyNiftyAdapter(Context context, Cursor c) {
super(context,c);
this.mInflater = LayoutInflater.from(context);
this.mContext = context;
this.cur = c;
}
public MyNiftyAdapter(Context context, Cursor c, boolean autoRequery)
{
super(context, c, autoRequery);
this.mInflater = LayoutInflater.from(context);
this.cur = c;
this.mContext = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
if(convertView == null)
{
convertView = this.mInflater.inflate(R.layout.single_item, null);
viewHolder = new ViewHolder();
viewHolder.name = (TextView)convertView.findViewById(R.id.txtName);
viewHolder.Age = (TextView)convertView.findViewById(R.id.studentage);
viewHolder.Id = (TextView)convertView.findViewById(R.id.rowid);
viewHolder.Image = (CircularImageView)convertView.findViewById(R.id.imgFood);
convertView.setTag(viewHolder);
}else
{
viewHolder = (ViewHolder)convertView.getTag();
}
this.cur.moveToPosition(position);
viewHolder.name.setText(this.cur.getString(this.cur.getColumnIndex(SQLiteHelper.NAME)));
viewHolder.Age.setText(this.cur.getString(this.cur.getColumnIndex(SQLiteHelper.AGE)));
viewHolder.Id.setText(this.cur.getString(this.cur.getColumnIndex(SQLiteHelper._ID)));
Uri jg = Uri.parse(this.cur.getString(this.cur.getColumnIndex("imagepath")));
Picasso.with(mContext)
.load(new File(String.valueOf(jg)))
.placeholder(R.drawable.profile)
.resize(800, 800)
.centerCrop()
.into(viewHolder.Image);
return convertView;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
// Dont need to do anything here
return null;
}
static class ViewHolder
{
TextView name;
TextView Age;
TextView Id;
CircularImageView Image;
}
}
的作用。
考虑以下示例:
IO
GHCi中的输出:
import Debug.Trace
blah :: IO String
blah = return "blah"
blah' = trace "outer trace" blah
woot :: IO String
woot = return (trace "inner trace" "woot")
main :: IO ()
main = do
b <- blah'
putStrLn b
putStrLn b
w <- woot
putStrLn w
putStrLn w
然后作者说:
我们只看到内部和外部发射一次,因为IO不是 旨在禁用不在IO中的值的共享 用于运行IO操作的过程。
作者试图说什么?
答案 0 :(得分:3)
这句话似乎很难解析,但这就是我想的意味着:
当您使用<-
引用IO
内的值时,b
和w
会成为String
值。 String
值是纯粹的(引用透明),因此可以共享。
分享价值的能力是纯粹的功能和价值的好处。虽然您无法从纯函数调用不纯函数,但您可以从不纯的上下文中调用纯函数,但我们不希望不纯的上下文更改我们的代码部分的属性&# 39;参考透明。
Haskell被懒惰地评估,所以你可以认为当你拨打putStrLn b
两次时,它会懒洋洋地评估blah'
两次,但它没有&#39}。 t,因为b
绑定到调用putStrLn b
的评估结果,而不是putStrLn b
本身。
换句话说,您可以在多个函数调用之间共享引用透明值,IO
不会禁用该属性。