禁用共享值

时间:2017-09-29 09:11:46

标签: haskell

我正在阅读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操作的过程。

作者试图说什么?

1 个答案:

答案 0 :(得分:3)

这句话似乎很难解析,但这就是我想的意味着:

当您使用<-引用IO内的值时,bw会成为String值。 String值是纯粹的(引用透明),因此可以共享。

分享价值的能力是纯粹的功能和价值的好处。虽然您无法从纯函数调用不纯函数,但您可以从不纯的上下文中调用纯函数,但我们不希望不纯的上下文更改我们的代码部分的属性&# 39;参考透明。

Haskell被懒惰地评估,所以你可以认为当你拨打putStrLn b两次时,它会懒洋洋地评估blah'两次,但它没有&#39}。 t,因为b绑定到调用putStrLn b的评估结果,而不是putStrLn b本身。

换句话说,您可以在多个函数调用之间共享引用透明值,IO不会禁用该属性。